ESP8266::MicroPython 簡単な2WDロボットカーの制御
<MicroPythonでのDCモータコントロール>
ESP8266のボード上でのMicroPythonのコードによるDCモータの制御を
検討して見ました。コントロールの対象を、2WDのロボットカーとし、
先に検討したWebSocketのモジュールを利用すればスマホからのWiFi
コント―ルで簡単に行える事が判りました。その様子は次の様な
ものでした。
[システム]
[主要部品]
[構成]
1.ESP8266の基板はWeMos D1 mini のクローンを利用
2.2WDのロボットカーのシャーシは中国製のキットを利用
3.DCモータ駆動用のHブリッジは L9110 を利用
4.ESP8266が取得したIPアドレスの表示用に0.96"のOLEDを利用
5.駆動用の電源は、Ni-MHを4本(1.2Vx4)にして対応
6.DCモータ駆動時の電圧低下補正用にステップアップコンバータを
利用
[動作状況]
<テスト内容>
DCモータの制御動作の検証に関しては次の事を目標としました。
1.PWM出力を利用する事で速度と回転方向の制御ができる事を確認
2.PWMの出力周波数に関しては、速度が50%以上では100Hz、
50%以下では10Hzとする事で、広い範囲の速度制御ができる
事を確認
3.WiFiを利用して、スマホのブラウザからロボットカーを制御する
状況を確認
結果としては、ほぼ期待通りの制御ができる事を確認しました。ただし、
左右のモータのバランスが思った以上に悪く、しかも、前進と後退で
様子が大きく異なった為、前進用と後退用にそれぞれバランス調整を
ける必要が有りました。でも、他のアプリにも十分利用可能で有る
事は判りました。
[機器の接続]
[コントロール画面]
ブラウザは iPhone の Safari
[コードモジュール構成]
モジュール内の「.mpy」と「.html」ファイルのデバイスへの
ダウンロードには adafuit-ampy を利用
[コードの設定]
「main.py」内のSSIDとそのパスワードの部分を、利用しているWiFiの
ものに変更して対応
[コードダウンロード]
Code download URL : https://drive.google.com/open?id=1-NHkzlk3gOZu6pSvjlVYz9XJ2Vdmy42B
STM32F103C8での1.8インチLCD高速描画処理
<KMR-1.8 高速描画処理の概要>
以前、STM32F103C8ボードでの動作を検討した「KMR-1.8 SPI LCD」の
高速描画対応を行ったのものを検討して見ました。その時の状況は次の
様なものでした。
1.LCDの解像度は128x160で、5/6/5の16bitsカラーで使用
2.LCDのコントローラはST7735でSPI制御方式
3.標準のSDカードスロットでカード端子とスロット端子は直結
4.電源電圧は今回3.3Vで使用
5.SDカード用とLCD用のSPIは別々の端子を利用
6.SDカードからのデータ読み取りとLCDへの描画データの転送には
DMAを利用
[動作状況]
<関連資料>
システム構成はこちらのものを利用しました。
<テスト内容>
今回のテストは高速描画を行う方法の検討で、以前行ったMotino-Jpeg
の時に検討したシステムを利用して描画をさせて見ました。
[目的と結果]
テストの確認目標は次のものでした。
1.Motion-Jpegの時に検討したシステムでの描画処理を確認
2.動きのある描画処理での見え方を確認
結果としては、次の様な状況で、ほぼ期待通りの高速化を実現
させる事ができました。
1.通常の描画処理も同じコードで対応可能でした。
2.動きの有る描画処理は、多少フリッカが気になりますが、
実用的には問題ない事が判りました。
以上の様な状況で、高速描画もほぼ期待通りに実現出来る事が
判りました。
[テストでの機器の接続]
[コードの構造]
[KMR-1.8 SPI LCD アクセス方法]
[テストSDの内容]
[コード類]
今回も、コードの開発にはSW4STM32のシステムを利用しました。
(STM32F103C8ボードののコード開発に 関してはこちらの記事を
参照して下さい。)
Code download URL : https://drive.google.com/open?id=1lPVg4vxUy2DVPeAPz23busg7ChX94A7L
ESP8266::MicroPython 1.44/1.8インチ ST7735ディスプレイ表示
<MicroPythonでのST7735コントロール>
ESP8266のボード上でのMicroPythonのコードによるST7735のLCDの
表示を検討して見ました。コントロール用のライブラリモジュール
としては、Arduinoのものを移植して行いました。結果としては、
MicroPythonを利用した場合には処理速度がかなり遅くなる様で、
実用的な描画速度は実現できませんでしたが、その様子は次の
様なものでした。
1.LCDの解像度は1.44インチは128x128で1.8インチは
128x160のフルカラー(今回はAdafruitと同じく565の
16bitsカラーで利用)
2.LCDのコントローラはST7735でSPI制御方式
3.電源電圧は、1.8インチは5Vで1.44インチは3.3Vで使用
4.ライブラリモジュールはAdafruitのArduino用ものを
MicroPython用に移植して利用
5.MicroPythonのボードはESP8266のWeMos D1 mini を利用
[動作状況]
<テスト内容>
ST7735LCDの動作検証に関しては次の事を目標としました。
1.ST7735のLCDをESP8266のMicroPythonで動作させた時の
状況を確認
2.ライブラリモジュールとしてArduino用のものを移植可能か
どうかの確認
3.その状態で、このLCD駆動用のサンプルコードを
作成して見る
結果としては、オリジナルの移植元のコードが大きかったので、
描画用の沢山の関数から必要なもののみを選択し、ホストで
コンパイル済みのmpy形式に変換して利用すれば、ESP8266の
MicroPythonでも利用可能な事が判りました。(文字の表示、
直線、円、四角の描画の関数を選択)また、このLCDでは描画を
ドット単位で行う為、描画用に大きなRAM領域を使用する事なく
複雑な描画が可能で有る事も判りました。ただし、MicroPython
上で動作させると描画速度が非常に遅くなり、余り実用的でない
感じを受けました。
[機器の接続]
[コード実装状況]
[コードダウンロード]
Code download URL : https://drive.google.com/open?id=1YY0catejcR4Fw8eEMI2DtrcQutG7ywzW
ESP8266::MicroPython Websocket test
<MicroPythonでのWebSocket test>
ESP8266のボードでArduinoのIDEを使った時のWebSocketのテストを
以前行いましたが、今回は、MicroPythonを使ったものを検討して
見ました。ただし、Arduinoの場合と違って利用できるライブラリーの
種類が一つしか見つからず、しかも、そのままでは自宅の家庭の
WiFiでは利用できないものでした。その為、公開されているライブラリ
モジュールの修正から検討し、取り敢えずArduinoの場合と同等に
動かす事ができる様になりました。その様子が以下のものです。
[構成]
1.ESP8266のボードはWeMosD1-mini (クローン)を使用
2.表示は0.96"のOLED(ssd1306)を使用
3.ブラウザはiPhoneのSafariを使用
4.コントロールターゲットは次のものを用意
<ブラウザ ---> ボード>
- 赤色LEDのオン/オフ
- 緑色LEDの明るさ調整
- サーボコントロール(SG90)の制御
- メッセージの転送
<ボード ---> ブラウザ>
- スイッチの状態表示
- ポテンショメータのA/D変換値の表示
- Rangeセンサーの計測結果の表示
- 温度センサーの計測結果の表示
[動作状況]
<関連資料>
MicroPythonの公開先は次のURLです。
URL : https://micropython.org/
利用したMicroPythonのファームウェアは以下のものです。
esp8266-20190125-v1.10.bin
WebSocket モジュールライブラリは次のものを修正して利用しました。
URL : https://github.com/BetaRavener/upy-websocket-server
<開発環境>
[ライブラリモジュールの変更]
公開されているWebSocketで利用できそうなものは上記の
「upy-websocket-server」しか見つからず、しかもサンプルコードを
そのまま利用すると自宅のWiFi上では次の問題が発生して、利用
できない事が判明しました。
1.Clientのブラウザと非常に繋がりにくい。
2.一旦繋がっても、直ぐに接続がクローズの状態となる。
(サンプルでは、1回通信するのみなので問題なし)
3.ブラウザのページをリフレッシュすると3回目から繋がらなくなる。
4.上記の問題を解決して通信が継続する様にしても、時々動作が
停滞する事がある。
その為の対策として、次の様に処理を変更、追加しました。
1.壊れた接続データの確認の為、データ解析を行う為に、
タイムアウト付きの予備のデータ解析を付け加えた。
2.接続がクローズ時のステータスの値が違っていたので、
自宅のものに合わせた。
3.同じブラウザからの再接続をチェックし、再接続の時は
前のものと入れ替える様にした。
4.通信が時々停滞する問題に関しては、まだ未解決
具体的なコード修正箇所は次の様になります。
[WeMosD1-mini ピン割り付け]
WeMosD1-miniは基板上にArduino互換の番号が付けられており、
基板上のピン名とESP8266チップのピン割り付けの関連が次の
様になり、コードはこのESP8266のチップのピン割り付け番号を
利用する事になります。
[コードのダウンロードと実行]
コードのダウンロードと実行は次の様に、一つずつファイルを
ドラッグアンドドロップでチップ内にダウンロードして、
ダウンロードが終了したらREPLコマンドでCtrl+Dを打ち込んで
リブート実行させます。
[コード類]
Code download URL : https://www.dropbox.com/s/xjzg0usou9rxior/MicroPyton_WebSocket_test.zip?dl=0
スマートフォンによる簡単な2WDカーのコントロール
<スマホアプリによる2WDモータカーコントロール>
スマートフォンのBluetoothアプリを使って、2WDのロボットカーの制御を
検討して見ました。スマートフォンのアプリとしては、AndroidとiOSで
同じものを提供している2種類を選び、その2種類が同一のソフトで対応
可能なものにして操作上の違い等も確認しました。その時の、状況は次の
様なものでした。
[スマートフォンアプリ]
スマートフォン側のアプリとしては、Android/iOS両方に同じものが有る
次の2つを利用しました。
[主要部品]
使用した部品としては下記のもので、長方形の車体にはSTM8S103Fを
円盤型の車体にはArduino Pro Miniをそれぞれ使用しました。
[構成]
部品を取り付けた状態の車体はそれぞれ下記の様になりました。
1.コントロール用スマホのアプリとしては、BLEJoystick と
LOFI control を使用
2.2WDの車体としては、長方形と円盤型のものを使用
3.CPUとしては、長方形の車体にはSTM8Sを円盤型には
Arduino Pro Miniをそれぞれ使用
4.DCモータ駆動用のHブリッジは L9110 を利用
5.Bluetooth-4.0のデバイスとしてはHM-10を利用
6.駆動用の電源は、Ni-MHを4本(1.2Vx4)にして対応
7.DCモータ駆動時の電圧低下補正用にDC to DC の
ステップアップコンバータを利用
[動作状況]
<テスト内容>
動作の検証に関しては次の事を目標としました。
1.Bluetooth-4.0のデバイスHM-10とのインターフェイスの
動作を確認
2.2つのスマホアプリからのデータ出力のフォーマットを
確認
3.スマホのアプリを利用してロボットカーを制御する状況を
確認
結果としては、ほぼ期待通りの制御ができる事を確認しました。
ただし、2つのアプリで走行方向制御の方法が異なる為、操作に
関しては好みがあるかと思いました。また、Bluetooth-4.0が
簡単に利用できる事も確認できました。
[機器の接続]
[Bluetoothデバイスとの接続]
Bluetoothデバイス HM-10 のアクセスに関しては、下記の様になっていて、
HM-10のBluetoothの無線接続が無効の場合、CPUとHM-10間のATコマンド
が有効となりBluetoothの無線接続が行われている場合は、無線接続
デバイスとのやりとりとなっています。その為、ATコマンドを有効に
するためのスイッチ等は付いていません。
有効なATコマンドの種類に関しては、Bluetooth無線接続が無効の状態で、
HM-10に"AT+HELP"のコマンドを送れば、有効なコマンドのリストが
返送されます。
[Applicationからの出力]
2つのスマホのアプリケーションのデータ出力はそれぞれ異なっており、
BLEJoystickでは1バイト毎に、LOFI controlでは画面上の6個の
アイテムをひとつにまとめて、12バイトのパケットで送っています。
また、LOFI controlではアイテム毎に2バイトを割り付けており、
最初のバイトがアイテム識別用で、次がアイテムのデータとなって
います。
[ホイールの交換]
もともと付いている駆動部分以外のホイールでは、前進と行進を切り
替えると、車体が大きく振れるので、下記の様な別なものと交換しま
した。これにより、前進と行進の切り替え時の振れは止める事が
できました。
[DCモータ制御用PWM]
車輪用のDCモータの駆動に関しては、モータ毎に2つの出力ポートを
用意し、1つはレベルをもう一つはPWMとして、モータの電源を
コントロールする様にしています。なお、CPU全てのポートがPWM
出力用にできる訳ではないので、回転方向の切り替えに関しては、
それぞれのポートの極性を切り替える方法で対応しています。また、
PWMに関しては、モータの起動に、有る程度の時間と電圧が必要と
なるため、低速時にはPWMの周波数を下げています。ただし、
そのままではガタガタするので、目標速度に応じて、PWMの周波数も
動的に変える様にしました。
[CPU基板の電源]
DCモータを駆動すると、モータの負荷により電源電圧が低下し、
CPU等が暴走状態となる場合があるので、DC to DCのステップ
アップコンバータを使って、CPU関連のデバイスの電源電圧を
保証する様にしています。
[コードの書き込み]
それぞれにCPUのコード書き込みに関しては、下記の様に行いました。
なお、STM8S103Fに関しては、IDEを使わないでライターブログラムで
Hexコードを書き込む事で対応できます。
[コードの構成]
STM8S用に関しては、Arduinoのコードを少しの変更で利用できる様に、
ラッパーを用意し、それにより、メインの部分はほぼそのまま使える
様にしています。
[コードダウンロード]
Code download URL : https://drive.google.com/open?id=1uAgdqboBhSCWWrrdcUTOZzy8lqJpobLc
ESP8266::MicroPython Stepperモータカーコントロール
<MicroPythonでのStepperモータコントロール>
ESP8266のボード上でのMicroPythonのコードによるステップモータの制御を
検討して見ました。コントロールの対象を、2WDのロボットカーとし、先に
検討したWebSocketのモジュールを利用すればスマホからのWiFiコント―ルで
簡単に行える事が判りました。その様子は次の様なものでした。
[システム]
[主要部品]
[構成]
1.ESP8266の基板はWeMos D1 mini のクローンを利用
2.モータドライバはA4988をトを利用
3.モータには28BYJ-48をバイポーラ型に改造して利用
4.ESP8266が取得したIPアドレスの表示用に0.96"のOLEDを利用
5.駆動用の電源は、Ni-MHを4本(1.2Vx8)にして対応
6.DCモータ駆動時の電圧低下補正用にDCtoDCの
ステップアップコンバータを 利用
[動作状況]
<テスト内容>
モータの制御動作の検証に関しては次の事を目標としました。
1.ドライバのA4988を1ポート出力で速度と回転方向の制御が
できる事を確認
2.WiFiを利用して、スマホのブラウザからロボットカーを
制御する状況を確認
3.Webページ上に動作シーケンスのリストを組んで、
プログラム走行ができるのを確認
結果としては、ほぼ期待通りの制御ができる事を確認しました。ただし、
モータの回転が非常に遅いため、大きなタイヤを付けてそれをカバー
する事を試みましたが、もう少し速度が欲しいと良いと思いました。
[機器の接続]
[モータドライバ制御]
ステッパーモータドライバのA4988は、回転方向と回転のためにそれぞれ
1ビットが必要で、1モータを2ビットで制御するインターフェイスと
なっていましたが、次の方式にする事で、1ポートのパルス極性で、
回転方向と回転速度を制御できる様にしました。
[電源システム]
ステッパーモータドライバA4988のモータ用電圧は8V以上なので、
CPUボード用の電源に更に別の電源を積み上げて、モータ用の電圧を
上げる方式としました。また、モータがオンするとモータの電流により、
そのままではCPUボード用の電圧も影響を受けて下がるので、以下の
様に電圧低下を補うためのDC to DCのステップアップコンバータを
利用しました。
[モータの改造]
今回利用したステッパーモータは、ユニポーラタイプですがドライバの
A4988はバイポーラ用のものなので以下の様な改造をして、バイポーラ型に
改造しました。
[オリジナルタイヤの取り付け]
今回利用したステッパーモータは、減速比が大きくて回転速度がとても
遅い為、ロボットカー用のモータとしては余り適していません。その為、
大きなタイヤを取り付ける必要が有り、100円ショップで売られていた
盆栽用の皿を利用しました。その取り付けは以下の様に行いました。
[走行パラメータ]
走行リストに左右のモータの速度(%)と走行時間を入力して、
動作シーケンスリストに追加すれば、プログラム走行ができる様に
しました。その時の走行パラメータに関しては、以下の様に計算しました。
--- 最大速度の計算 ---
--- 回転走行の計算 ---
[制御用のWebページ]
MicroPpythonでは、Htmlファイルをそのまま扱えるのでとても便利です。
今回作成したWebページは下記のもので、最初のものがページ全体で、
ページはマニュアルコントロールとプログラムコントロールの部分から
できていて、その次のものが、各々のコントロール部分を表したものです。
--- 全体 ---
[コード関連]
実際のWiFiへのアクセスには、使っているネットワークのパラメータを
コード上に記述する必要が有り下記の様に、その部分を変更する必要が
有ります。
[コードダウンロード]
Code download URL : https://drive.google.com/open?id=1V6OMweu8FtSdqbxJ2c6jOjJVD5gEB5uy
"0.96" OLED diplay with MicroPython on the ESP-01
ESP-01の動作サンプルで、LEDの点滅より少し複雑なものとして手持ちの
2.IDEへの接続には、汎用の安価はUSB to Uart TTLのボードを利用
3.コード確認用の部品としては次のものを用意
- ESP-01
- ESP-01用アダプター
- "0.96"OLED(ssd1306チップ)
- リセット用のタクトスイッチ
- 5V to 3.3Vの電圧降下レギュレータ
[動作状況]
MicroPythonの公開先は次のURLです。
URL : https://micropython.org/
ESP32/8266の書き込みツール(esptool)は次のURLです。
URL : https://pypi.org/project/esptool/
利用した開発用IDE(uPyCraft)は次のURLです。
URL : https://dfrobot.gitbooks.io/upycraft/content/
ESP32/8266のMicroPythonによるLED点滅テストの記事はこちらです。
<開発環境>
[ファームウェアの書き込み]
開発したモジュールのコードはファームウァア上で行う為、ファームウェア
2.チップの書き込みモードには、チップのリセット直後のGPIO0の状態に
5.ファームウェアの書き込みが終了したら、RST端子に接続されている
[アプリケーション開発用の接続]
アプリケーションモジュールの開発は次の構成で行います。
開発したモジュールのチップ上へのダウンロードと実行は次の様に行います。
2.ダウンロードが完了したら、IDEの"device"フォルダ内の実行モジュールを
[".py"と".mpy"の違い]
".py"と".mpy"でのチップ内のRAMの消費量の違いは次の様になっていました。
ESP8266の場合は、僅かな節約の様です。
"uPyCraft"では、バイナリーファイルのダウンロードには対応していない様で、
ダウンロードには、次の様に一旦IDEのUartの接続を切り離して、上記のPC上の
Pythonのモジュールを利用して行います。
複数のモジュールで実行を行う場合、実行モジュールから参照している
Code download URL :