第6回 自作TELNET・プロポ
2025.04.24
YouTube でも紹介しています。画像をクリックすると再生できます。
今回はTELNET通信による遠隔制御を行います。
最初はTeraTermを使ってロボットカーを制御し、それをTELNETプロポーショナルシステム、略してTELNETプロポに置き換えていきます。
ロボット・カーの組立て
●Arduino UNO用ロボット・カー
今回作成するTELNETプロポのテスト用に購入しました。

ロボット・カーですが、Arduino UNO搭載型のロボット・カーが加工しやすいです。
すでに組み立て済みの中古品を購入したためArduino UNOを含め不要なパーツを取り外し、モータドライバモジュールのみを残しました。

・瞬間ピーク電流は最大3A、定格電流25W
・2個の内蔵Hブリッジ
・2相ステッピングモータまたは4相ステッピングモータ、2相DCモータを駆動可能
・ドライブ電圧:5-35V、ロジック電圧:5V。※ドライブ電圧が12Vを超える場合は、外部5Vロジックを使用
OSOYOO Model-X Motor Driver Module
仕様に関しては下記をご覧ください
ドローン制御 まずはロボットカーでお勉強
●KeyeStudio 328 WiFi Plus
2025年4月8日の記事で紹介したUNOボードに通信用ESP8266を搭載したマイコンボードです。
OSOYOO Model-X Motor Driver Module は、外部5Vロジックなのでこちらの拡張UNOボードを使いましたが、
3.3V駆動のモータードライバーモジュールであれば、ESP8266搭載のWeMos D1や後述のKeyestudio ESP32 PLUS のようなArduino UNO形状のボードでもよいと思います。

ESP8266およびUNO側プログラムのビルド、アップロード方法は下記をご覧ください。
KeyeStudio 328 WiFi Plus

最小構成のロボットカーに、328 WiFi Plus を取付けています。
ソースコードのビルドには、PlatformIOを使用しています。
Arduino開発環境構築 PlatformIO
●ESP8266側プログラム
ESP8266側プログラムでは、TELNETサーバを起動してクライアントからの送信文字を受け取ります。
受け取った文字はそのままUNO側にシリアル出力します。
telnet.ino (抜粋)
void loop()
{
if (telnet.connected()) {
while (telnet.available()) Serial.write(telnet.read());
} else {
telnet.begin(&server);
}
}
WiFiサーバはSTAモードで起動し、ESP8266には固定でIPアドレス 192.168.11.64を割り振っています。
※記事の最後のリンクからソースコードをダウンロードできます。
●UNO側プログラム
ESP8266から受け取った文字に従い、モータードライバーモジュールに動作を指示します。
control.ino (抜粋)
void set_Motorspeed(int SPEED_L,int SPEED_R)
{
analogWrite(PIN_ENB, SPEED_L);
analogWrite(PIN_ENA, SPEED_R);
}
void go_Advance(void) //Forward
{
digitalWrite(PIN_IN1, HIGH); // IN1
digitalWrite(PIN_IN2, LOW); // IN2
digitalWrite(PIN_IN3, HIGH); // IN3
digitalWrite(PIN_IN4, LOW); // IN4
set_Motorspeed(SPEED, SPEED);
}
void loop()
{
if (Serial.available()) {
elapsed_time = millis();
char c = Serial.read();
if (command != c) {
switch(c) {
case 'U': go_Advance(); break;
case 'L': go_Left(); break;
case 'R': go_Right(); break;
case 'D': go_Back(); break;
case 'C': stop_motor(); break;
default:break;
}
command = c;
}
} else {
if (command != 'C') {
if ((millis() - elapsed_time) > 1000) {
stop_motor();
command = 'C';
}
}
}
}
TELNET通信の不意の切断に備えて、ロボットカー側に自動停止機能を付けています。

ロボットカーの電源を入れます。

ESP8266で設定したIPアドレスを指定してTeraTermを立ち上げます。

ロボットカーに接続されると、接続先IPアドレスと電波強度が返されます。
パソコンのキーボードからU(前進)、L(左折)、R(右折)、D(後退)、C(停止)キーを押すとロボットカーが指示に従い動作します。
また、プロポ側からの通信が1秒以上途絶えたときにはモーターを停止させる処理を入れています。
それでは、TeraTeam の操作を、TELNETプロポーショナルシステム、略してTELNETプロポに置き換えていきます。
コントローラの組立て
コントローラ側で必要となる部品です。
●ジョイスティックRKJXV122400R DIP化キット

●アナログ・スティック

amazon ではジョイスティック・キットとしても販売してるので、それらを購入されたほうが割安かもしれません。
●keyestudio UNO Prototype Circuit Breakout Board PCB


プロトタイプ基板にジョイスティック・キットをはんだ付けしています

配線はこんな感じになります。ヘッダーピンを付けてUNOのハットにしています。
●Keyestudio ESP32 PLUS Development Board WROOM-32 module WIFI+Bluetooth Compatible with Arduino
UNO形状のESP32ボードを使用し、ジョイスティックを被せて一体化します。
ESP32のWiFi機能を利用して、ジョイスティックからの指示を送信、
これをロボット・カーに搭載した328 WiFi Plus で受信してサーボ・モータを制御しています。
※画像をクリックすると拡大表示されピン配置を確認できます
Keyestudio ESP32 PLUS Development Board
This is a universal WIFI plus Bluetooth development board based on ESP32, integrated with ESP32-WROOM-32 module and compatible with Arduino.
It has a hall sensor, high-speed SDIO/SPI, UART, I2S as well as I2C. Furthermore, equipped with freeRTOS operating system, which is quite suitable for the Internet of things and smart home.
Specifications
CPU: Tensilica Xtensa LX6 microprocessor 240 MHz
Memory: 448KB ROM / 520KB SRAM
Voltage: 3.3V-5V
Current Output: 1.2A(maximum)
Maximum power Output: 10W
Working temperature: -10℃~50℃
●Arduino UNO R3用エンクロージャ

ESP32 PLUS Development Board を格納しようとすると、外部電源ソケットの位置が合わないため、スチロールカッターなどでケースの一部を切断する必要があります。

UNO型ESP32に被せるジョイスティック・ハットはこんな感じになります
ジョイスティックとESP32の接続は下記の通りです
JOYSTICK | ----- | ESP32 |
L-SWITCH | ------- | GPIO32 |
L-Y | ------- | GPIO34 |
L-X | ------- | GPIO36 |
R-SWITCH | ------- | GPIO33 |
R-Y | ------- | GPIO35 |
R-X | ------- | GPIO39 |
GND | ------- | GND |
V | ------- | 3.3V |
ESP32 Plus にコードを書き込み、動作確認してみます
#define JOYSTICK_LX 34
#define JOYSTICK_LY 33
#define JOYSTICK_LSW 32
#define JOYSTICK_RX 39
#define JOYSTICK_RY 36
#define JOYSTICK_RSW 35
void setup()
{
Serial.begin(115200);
}
void loop()
{
uint16_t Lx, Ly, Rx,Ry;
Lx = analogRead(JOYSTICK_LX);
Ly = analogRead(JOYSTICK_LY);
Rx = analogRead(JOYSTICK_RX);
Ry = analogRead(JOYSTICK_RY);
Serial.printf("Lx:%d Ly:%d Rx:%d Ry:%d\n",Lx,Ly,Rx,Ry);
delay(500);
}
シリアルモニタを起動して、ジョイスティックからの取得値を表示してみます
$ pio device monitor -p /dev/ttyUSB0 -b 115200

取得できる値の範囲は12ビットの整数値0~4095です。
ジョイスティック無操作(中心にある状態)では中央値を取得できるはずですが多少のズレが生じています。
まずは無操作状態での中央値の平均を求めます。
次にスティック操作の変位量から、レバーの方向を算出します
左のジョイスティック、右のジョイスティックの順で動かしてみた結果です。左右同時でも構いません。

ロボット・カー制御には左側のジョイスティックのみを使用します。
L→L(左旋回),R→R(右旋回),U→A(前進),D→B(後退),C→S(停止)としてロボット・カーに指示を与えます。
次にデータ送信するためのTELNETクライアントを組み込みます。
●TELNETクライアント
TELNETクライアントとして参考になるなライブラリを探すのに苦労しました。

ivanalayan15/ESP-Telnet-Client
上記の github から3つのソースコードを用います。
・src > ESPTelnetClient.cpp
・src > ESPTelnetClient.h
・examples > telnetRaspberry > telnetRaspberry.ino
クラスファイルはそのまま使用できます。
変更するのはラズベリーパイ用TELNETクライアントのソースコードです。
ESP8266用なので、インクルードするファイルはESP32用に変更します。
controller.ino (抜粋) ※telnetRaspberry.inoから名称変更
void setup()
{
while(1) {
if (digitalRead(JOYSTICK_LSW) == LOW) break;
delay(100);
}
ジョイスティックはプッシュボタンの機能を持っています。
レバーを押すことで処理を開始するようにしました。
LXcenter = 0; LYcenter = 0; RXcenter = 0; RYcenter = 0;
for (int i=0; i<30; i++) {
LXcenter += analogRead(JOYSTICK_LX);
LYcenter += analogRead(JOYSTICK_LY);
RXcenter += analogRead(JOYSTICK_RX);
RYcenter += analogRead(JOYSTICK_RY);
}
LXcenter /= 30;
LYcenter /= 30;
RXcenter /= 30;
RYcenter /= 30;
ここでは、ジョイスティック無操作状態でのX座標、Y座標の平均値を求めています。
if (!WiFi.config(LOCAL_IP, GATEWAY, SUBNETMASK, PRIMARY_DNS)) while(1);
WiFi.mode(WIFI_STA);
WiFiMulti.addAP(SECRET_SSID, SECRET_PASS);
Serial.print("Waiting for WiFi ");
while (WiFiMulti.run() != WL_CONNECTED) {
Serial.write('.');
delay(500);
}
Serial.printf("\nWiFi connected\n");
IPAddress ip = WiFi.localIP();
Serial.printf("CONTROLLER: %d:%d:%d:%d\n",ip[0],ip[1],ip[2],ip[3]);
Serial.printf("login ");
while (!tc.login(esp8266IP)) {
Serial.write('.');
delay(500);
}
Serial.printf("\n");
}
ログイン時にユーザ名、パスワードは不要なので、接続先のIPアドレスのみを指定しています
char stick(int horizontal, int vertical)
{
char judgeH = 'C', judgeV = 'C';
int diffH = 0, diffV = 0;
if ((horizontal < 0) && (horizontal < (FREE_PLAY * -1))) {
judgeH = 'L'; diffH = (horizontal - FREE_PLAY) * -1;
} else if ((horizontal > 0) && (horizontal > FREE_PLAY)) {
judgeH = 'R'; diffH = (horizontal - FREE_PLAY);
}
if ((vertical < 0) && (vertical < (FREE_PLAY * -1))) {
judgeV = 'D'; diffV = (vertical - FREE_PLAY) * -1;
} else if ((vertical > 0) && (vertical > FREE_PLAY)) {
judgeV = 'U'; diffV = (vertical - FREE_PLAY);
}
if ((diffH > diffV)&&(judgeH!='C')) {
return judgeH;
} else if ((diffH < diffV)&&(judgeV!='C')) {
return judgeV;
} else {
return 'C';
}
}
ジョイスティックのレバー操作判定処理です。中央値から乖離幅が最大の方向を判定しています。
void loop()
{
int Lx, Ly;
char stickLeft;
unsigned char ch;
static int pos = 0;
Lx = analogRead(JOYSTICK_LX) - LXcenter;
Ly = analogRead(JOYSTICK_LY) - LYcenter;
stickLeft = stick(Lx,Ly);
tc.write(stickLeft);
while(tc.available()) {
ch = tc.read();
switch (ch) {
case 0xff:
pos = 2;
break;
default:
if (pos > 0) {
pos--;
} else {
Serial.write(ch);
}
break;
}
}
delay(10);
}
ループ内のwhile() {}はTELNET通信でのネゴシエーション情報をカットしています
コントローラはUSBまたはDCジャック給電で動作しますが、
ラズベリーパイとのUSB接続による電源供給時にはシリアルモニタを利用できます
$ pio device monitor -p /dev/ttyUSB0 -b 115200

ロボットカーの電源を入れます。続いてコントローラのプッシュボタンを押して接続を開始します。
レバーを操作すると、指示に従いタイヤが回ります。

今回は屋内での試験的な操作なので、STAモードで設計していますが、屋外で使用する場合はAPモードに変更してください。
その際には電波が届かなくなることも考慮して、ロボットカー側に自動停止機能を付けてください。
if ((millis() - elapsed_time) > 1000) {
stop_motor();
command = 'C';
}
●I2C JOYSTICK 2 UNIT (STM32G030)
今回のようなラジコンにはジョイスティック1つで済むので下記のジョイスティックでも対応できます

ドキュメント
ジョイスティックを搭載したコントロール用ユニットです。
I2Cインターフェースを採用しており、3軸コントロール信号入力(X軸/Y軸アナログ入力、Z軸キーデジタル入力)に対応しています。
特徴
〇X軸 / Y軸 + Z軸プッシュボタン
〇STM32G030マイコン搭載
〇RGB LEDを搭載
〇I2C制御
〇ふたつのレゴ互換穴
〇開発プラットフォーム:Arduino、UIFlow
仕様
〇MCU:STM32G030F6P6@Cortex-M0+、32 KBフラッシュメモリ、8KB SRAM、64 MHz
〇通信プロトコル:I2C: 0x63
〇X/Y軸オフセット出力:16-bit ADC出力(0-65535)
〇Z軸ボタン出力:0/1
〇RGB LED:1 x WS2812C
〇製品サイズ:40 x 24 x 23.9 mm

m5stack/M5Unit-Joystick2

GroundStudio Carbon D4 (ESP32-PICO-D4)にはQWIICコネクタが付いています。
●ソースコード
自作TELNET・プロポ SOURCE CODE
※TELNETクライアント・ライブラリは本文記載のURLからダウンロードしてください
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
Arduinoで学ぶ組込みシステム入門(第2版)
●Arduinoを使って組込みシステム開発を理解する
・ハードウェアやソフトウェアなどの基礎知識/
・設計から実装までを系統的に説明するモデルベース開発/
・Arduinoを用いた実際の開発例
最新 使える! MATLAB 第3版
◆◆すぐに「使える!」 全ページフルカラー!◆◆
・MATLAB R2022bに対応し、解説もより詳しく!/
・コマンド・スクリプトの例が豊富で、動かして学べる!/
・超基本から解説。これから使いはじめる人にぴったり!/
・全編フルカラー、スクリーンショットも豊富!
Amazon Web Services基礎からのネットワーク&サーバー構築改訂4版
1.システム構築をインフラから始めるには/
2.ネットワークを構築する/
3.サーバーを構築する/
4.Webサーバーソフトをインストールする/
5.HTTPの動きを確認する/
6.プライベートサブネットを構築する/
7.NATを構築する/
8.DBを用いたブログシステムの構築/
9.TCP/IPによる通信の仕組みを理解する
C言語は第二の母国語: 独学学生時代から企業内IT職人時代に培った、独立のための技術とノウハウ 平田豊著
学生時代から独学でプログラミングをはじめ、企業内でデバイスドライバを開発し、そして独立後もたくさんのアプリケーション開発や技術書制作に携わってきた著者。その筆者が大事に使い続ける「C言語」の“昔と今”について、気づいたことや役立つ知識、使ってきたツールなどについて、これまで記してきたことを整理してまとめました。
本書では、現役プログラマーだけでなく、これからプログラミングを学ぶ学生などにも有益な情報やノウハウを、筆者の経験を元に紹介しています。
1冊ですべて身につくJavaScript入門講座
・最初の一歩が踏み出せる! 初心者に寄り添うやさしい解説
・最新の技術が身につく! 今のJavaScriptの書き方・使い方
・絶対に知っておきたい! アニメーションとイベントの知識
・プログラミングの基本から実装方法まですべて学べる
図解! Git & GitHubのツボとコツがゼッタイにわかる本
ソフトウェア開発では欠かすことのできないGit、GitHub。
これからGit、GitHubを使いたいという入門者の方でも、実際に手を動かしながら使い方を学べます。
C自作の鉄則!2023 (日経BPパソコンベストムック)
メーカー製のパソコンはスペックが中途半端で、自分が本当に欲しい機種がない――。そう思っている人には、ぜひ自作パソコンをお薦めします。自作パソコンのパーツは進化が速く、しかも驚くほど種類が豊富。価格も性能も、幅広く用意されているため、満足度100%の“自分だけの1台”を手に入れることができます。
Interface 2023年6月号
特集:第1部 フィルタ設計 基礎の基礎/
第2部 係数アプリや波形観測アプリで合点!FIR&IIRフィルタ作り/
第3部 配布プリント基板で体験!マイコンで動くフィルタ作り
日経Linux 2023年5月号
【特集 1】 AI時代の最強フリーソフト ~ 25のやりたいを実現!
【特集 2】 AWS、Azureのうまみを無料で体感!面倒なことはクラウドに任せよう
【特集 3】 新しいRaspberry Pi Cameraで遊んでみよう
【特集 4】 Linuxで旧型PCを復活! 1kg切るモバイルPCを「ChromeOS Flex」でChromebook化
ラズパイマガジン2022年秋号
特集:5大人気ボード 電子工作超入門
「半導体不足で在庫が不足し、電子工作のボードがなかなか買えない…」。そんな今にふさわしい特集を企画しました。5種の人気ボードにすべて対応した電子工作の入門特集です。「GPIO」や「I2C」を使った電子パーツの制御方法は、どのボードでも同じです。手に入れられたボードを使って、今こそ電子工作を始めましょう。
地方で稼ぐ! ITエンジニアのすすめ
学歴、理系の知識、専門スキル……全部なくてもITエンジニアになれる!
地方でも高収入でやりがいをもって働ける!ITエンジニアの魅力を一挙大公開
Raspberry Piのはじめ方2022
本書は、ラズパイやPicoの買い方やインストール、初期設定といった基本から、サーバー、電子工作、IoT、AIといったラズパイならではの活用方法まで、1冊でお届けします。
ラズパイをこれから始める方向けに、全36ページの入門マンガ「女子高生とラズベリーパイ」も巻末に掲載。これを読むだけでラズパイがどんなものなのか、すぐに分かって触れるようになります。
ハッカーの学校 IoTハッキングの教科書
生活にとけこみ、家電機器を便利にするIoT技術。
Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。
専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。
本書は2018年7月に刊行された「ハッカーの学校IoTハッキングの教科書」に一部修正を加えた第2版です。
攻撃手法を学んで防御せよ! 押さえておくべきIoTハッキング
本書は、経済産業省から2021年4月にリリースされた、IoTセキュリティを対象とした『機器のサイバーセキュリティ確保のためのセキュリティ検証の手引き』の『別冊2 機器メーカに向けた脅威分析及びセキュリティ検証の解説書』をもとに、IoT機器の開発者や品質保証の担当者が、攻撃者の視点に立ってセキュリティ検証を実践するための手法を、事例とともに詳細に解説しました。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
プログラマーは世界をどう見ているのか 西村博之著
イーロン・マスク(テスラ)、ジェフ・べゾス(Amazon)、ラリー・ペイジ(Google)…etc.
世界のトップはなぜプログラマーなのか?
ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場!
高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。
DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。
作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。
Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。
この本では,ベイズ統計学のきほんをやさしく紹介していきます。
白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81
無水エタノールP 500mlx2個パック(掃除)
ケイバ(KEIBA) マイクロニッパー MN-A04
サンハヤト SAD-101 ニューブレッドボード
白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02
[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠
|