mechatronics / robotics

ブログ

マイクロマシーン チュートリアル(11)

●delay()を使わない方法  これまでサーボの動きを制御するのにArduinoのdelay()関数を使ってきました。delay()関数はスケッチ内容が比較的明確で単純な確認のような目的には有用ですが、ひとつ欠点があります。delay()実行中は他の処理が止まってしまうので、少し込み入ったプログラムの場合には不具合が生じることがあります。幸いタイマーの割り込みは禁止されませんので前回までのプログラムは意図通りの動きをしてくれました。 ここでは、delay()を使わないでサーボをコントロールする方法の例を示しておきます。具体的には、オーディオの再生で使用したタイマー割り込みをもう一つ30msecで常時まわして時間をカウントします。 ・mm11

マイクロマシーン チュートリアル(10)

●ロボットを完成させる 前回までの内容を全て盛り込んで完成版のロボットにしてみましょう。 ・リモコンボタンで前進、後退、右旋回、左旋回、右横、左横、停止をコントロール ・リモコンボタンで音声再生 ・リモコンボタンでLEDをON/OFF

マイクロマシーン チュートリアル(9)

●オリジナル音声を作る オリジナルの音声(フリーの効果音など)をArduinoのプログラムに組み込むために、2つのフリーソフトを利用します。以下のソフトをダウンロードしてインストールしてください。 ・Audacity(音声編集ソフト) ・stirling(バイナリエディタ) まず、用意した音声ファイル(ここではrobot-footstep1.mp3というファイル)をAudacityで開きます。 元の音声がステレオの場合には、「編集」->「選択」->「すべて」としてから、「トラック」->「ステレオからモノラルへ」でモノラルに変換します。 左下の「プロジェクトのサンプリング周波数」を8000Hzとして、「ファイル」->「オーディオの書き出し」、「ファイルの種類」を「その他の非圧縮ファイル」、「ヘッダ」を「WAV(Microsoft)」、「エンコーディング」を「Unsigned 8-bit PCM」として「保存」->「OK」します。 次にstirlingを起動して今保存したwavファイルを開きます。 右側の列を見て”data”となっているすぐあと辺りから後ろをすべて選択してコピーします。 Windowsのメモ帳を開いて貼り付けます。 カーソルを先頭に持っていき、「編集」->「置換」で「検索する文字列」に” “(半角スペース)、「置換後の文字列」に”,0x”(コンマ ゼロ エックス)を入力して「すべて置換」します。”0x”は16進数の印です。先頭のみ置換されていませんので”0x”を手入力したのち、全体をコピーしてArduinoプログラムの”sounddata.h”の当該箇所に貼り付けます。

マイクロマシーン チュートリアル(8)

●音声出力 次にスピーカーから音声を鳴らしてみます。ESP32にはアナログ出力機能がありますので(DAC-Digital Analog Converter)、これをオーディオアンプに入力してスピーカーを鳴らします。 オーディオソースはサンプリング周波数8kHzのWAVデータとし、124usecごと(約8kHz)のタイマー割り込みでDAC端子にアナログ出力していきます。音声データは0〜255(unsigned char)の値を行列データとしてプログラム内に直接記述し、フラッシュメモリに読み込ませます。全く圧縮していない形式で、1秒間の音声で1byte*8000=8Kbyte必要です。 まずは電源ONで「ロボットの足音」を1回だけ再生するプログラムを作っていきます。タイマー割り込みのスケッチ例を書き換えていきますので、「ファイル」->「スケッチ例」->「ESP32」->「Timer」->「RepeatTimer」を開いてmm08として保存してください。タイマー関連の不要部分を削除して、DAC関連のコードを追加します。 なお、音声データは”sounddata.h”として別ファイルで与えます。 ・プログラム ・データファイル Arduino IDEの右側にある下向き三角をクリックして新規タブ名を”sounddata.h”としてOKすると新しいタブが現れますので、そこに以下をコピペします。 ロボットで実行し音声が再生されるのを確認します。プログラムサイズが大きいので転送には時間がかかります。 ●プログラムの説明 参照:回路図 オーディオアンプ オーディオデータをインクルードします。 wavデータの位置を124usecごとにカウントアップします。 esp32マイコンのIO25ピンに音声データをアナログ出力します。IRAM_ATTR onTimer()はタイマー割り込みで呼ばれる関数です。 タイマー割り込みの間隔を124usecに設定します。 オーディオアンプのCEピンをLOWにして有効化します。 ●練習問題 リモコンのボタンで音声が再生されるようにしてください。 “mm08″で保存します。

マイクロマシーン チュートリアル(7)

●リモコンを使う(2) 前回のプログラムに少し追加してLEDをON/OFFしてみます。”mm06″を開いて”mm07″で名前を付けて保存します。 “1”ボタンでON、”2″ボタンでOFFです。 loop()の中でdataCodeをシリアル出力していた部分をswitch文に書き換えて、dataCodeが”12″(“1″ボタンが押された)ならLEDをON、dataCodeが”24″(“2″ボタンが押された)ならLEDをOFFします。 ・”mm06″を変更 うまくいきましたら次はリモコンでロボットの歩行をコントロールしてみます。”1″ボタンで前進、”2″ボタンでストップです。現状のプログラムに以前作ったサーボのプログラム部分(mm05)を足していきます。 ●練習問題 前進、後退、右旋回、左旋回、右横、左横、停止をリモコンボタンに割り当ててコントロールできるようにしてください。 ヒント:リモコンボタンのデータコードは”mm06″を実行して確認できます。 “mm07″で保存します。

マイクロマシーン チュートリアル(6)

●リモコンを使う 赤外線リモコンでロボットをコントロールしてみます。リモコン送信器にボタン電池(CR2025)を挿入してください。リモコン受信部はメイン基板上部の3本足の部品です。 リモコン信号のフォーマットについてはこちらをご覧ください。 図の横軸は時間で、左側からON,OFF,ON,OFF…とバーコードのような赤外線信号が受信器に到達します。これが5V,0Vの電圧に変換されてマイコンのピン(IO16)に入力されます。一応注意が必要なのが、ONが1信号、OFFが0信号とはならないことです。ONの後に長いOFFが来ると1、ONの後に短いOFFが来ると0と判断します。プログラムでは、IO16ピンの入力状態をチェックしてONの長さ、OFFの長さを時間計測しながら信号を解析(デコード)していきます。信号全体はリーダー、カスタムコード(16bit)、データコード(8bit)、データコード(8bit-反転)の順にやってきますのでその順で処理していき、今回はデータコード(8bit)の値を見てどのボタンが押されたのかを判断します。 リモコン”1″ボタンの信号(リモコン受光部の出力:HIGH/LOWが反転しています) まずは、受信したデータコード(8bit)をシリアルモニタに出力してボタンに対するデータの値を確認します。IO16ピンの入力チェックには、 attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); という「外部割込み」を使います(もう一つの割り込みは「タイマー割り込み」)。これを利用すると、ピンの状態を勝手にチェックしてくれて変化があった場合には指定の関数を自動で実行してくれます。 プログラムは少し長いですが、フォーマットの図と見比べながら追ってみてください。リモコン受光部品の出力がHIGHやLOWに変化するたびにrmUpdate()が呼ばれ、HIGH時間、LOW時間を測定し信号が1なのか0なのかを調べていきます。ステートマシンという方法です。100%わからなくてもこのプログラムをコピペして実行し、リモコン送信でシリアルモニタに数字がでてくることを確認してください。 ・プログラム “mm06″として保存しておきます。

マイクロマシーン チュートリアル(5)

●基準姿勢を調整する ロボットを組み立て終わりましたらいよいよ電源を入れて立たせてみます。 “mm03″のプログラムを保存した方はもう一度開いて”mm05″として保存します。loop()の中を削除します。 この状態でロボットに転送して実行しますが、倒れないようにロボットは寝かせておきます。腕は割とラフで構いませんが、両足は前から見て、横から見て、まっすぐになるようにソフト的にこれを修正します。下記のように修正用の変数”offset[12]”(名前はなんでも良い)を使います。 一応各関節(サーボ)に名前をつけました。 0 LHR Left Hip Roll 左股関節左右 1 LHP Left Hip Pitch 左股関節前後 2 LAP Left Ankle Pitch 左足首前後 3 LAR Left Ankle Roll 左足首左右 4 LSP Left Shoulder Pitch 左肩前後 5 LSR Left Shoulder Roll 左肩左右 6 RSR Right Shoulder Roll 右肩左右 7 RSP Right Shoulder Pitch 右肩前後 8 RAR Right Ankle Roll 右足首左右 9 RAP Right Ankle Pitch 右足首前後 10 RHP Right Hip Pitch 右股関節前後 11 RHR Right Hip Roll 右股関節左右 サーボの角度指定のところに補正値を足して実際に出力される角度を修正しています。offset[]の値をいろいろ変えてロボットを立たせてみてほどよい値を見つけてください。サーボの回転方向はこちらの図で確認してください。最初から大きくずれてしまっている場合(30°以上)はサーボホーンを1歯ずらしてみてください。 だいたい合ったところで電池を背負った状態で後傾になっていないかどうか確認します。もし後ろに体重がかかっていると歩行で倒れやすくなりますので、足首の関節で調節します。 非常に根気のいる作業です。落ち着いて頑張りましょう。下図の矢印は各サーボの+の回転方向を示しています。 ●歩行させる 調整が終わりましたら歩かせてみます。とりあえず下記の変更部分を追加して動かしてみましょう。 いかがでしょうか。倒れずに前に進めば合格です。左右で動きが違う等の問題はイニシャル姿勢のオフセット調整で修正します。 ●プログラムの説明 歩行動作の各関節の角度を配列で与えます。配列の行(全体の姿勢)を順番に送ってアニメーションさせます。データ更新の時間間隔を短くすれば滑らかな動きになりますが、逆にデータ量が増えてしまいます。このため大まかな姿勢データのみを与え(キーフレームと呼ぶ)、その間を細かい時間で補間する、という方法をとります。サーボのデータ更新は30msecごとに行うこととして(delay(30))、配列右端の数値でフレーム間を分割して角度が徐々に変化するようにします。 角度の計算は、 現在角度 = 今回キーフレーム角度 + (次回キーフレーム角度 – 今回キーフレーム角度) * 分割カウンター / 分割数 という感じで、分割カウンターは毎回+1して分割数に達したら0に戻します。そのタイミングで今回キーフレームと次回キーフレームを次の行に更新します。 ●練習問題 後ろに歩かせてください。 ●練習問題 左右旋回させてください。 ・左旋回 ・右旋回 ●練習問題 横歩きさせてください。 ・右横歩き ・左横歩き

マイクロマシーン チュートリアル(3)

●サーボを動かす サーボを動かしてみましょう。サーボの出力軸(白いギザギザのところ)は通常0°~180°の範囲で回転しますが、その位置はサーボの容器に対して絶対的に決まっています。そのため出力軸の回転位置を気にせずに適当にロボットを組み立ててしまうと、出力に取り付けられた部品が思い通りに動いてくれません。まずはサーボの出力軸を90°の位置に停止させるプログラムをつくります。 下の写真を参考に配線してください。サーボは電池から電源を供給する回路になっていますので、今回は電池をつなぎます。サーボは12個使いで対応するコネクタが12箇所ありますが、すべてのコネクタから90°の信号を出力します。サーボのコネクタは逆向きに挿しても動きませんが壊れることはありません。中央のピンがプラス電源となっているためです。一方、電池のワイヤーは逆につけるとマイコンが壊れますので絶対に間違えないでください。コネクター側基板上に”G”と記載されている側がグランド(黒線)です。 電源スイッチはOFF側にしておきます。 *サーボを取り扱う際の注意 サーボは非常に精密なギアで構成されています。出力軸を回そうとして(「バックドライブ」と言います。)引っ掛かりがある場合に無理に回そうとするとギアを破損します。 ハードウェアの準備ができましたらプログラムを作っていきます。通常Arduinoでサーボを動かす場合専用の関数を使って簡単に駆動できるのですが、今回サーボが12個と多いので「PCA9685」というICを利用してESP32マイコンからI2Cで制御するようにします。 Arduino IDEを起動して「ボード」と「シリアルポート」の設定をしてください。 下記のプログラムを書き込みます。 チェックボタンでコンパイルが成功したら、矢印ボタンでメイン基板に書き込みます。「ボードへの書き込みが完了しました。」と出たら基板の電源スイッチをONにします。サーボが動いて90°の位置(センター位置)で停止します。(新品のサーボを用いた場合はもともと90°の位置になっていて動かない場合があります。) ●プログラムの説明 プログラムの内容的にはPCA9685とのI2C通信に関する部分がほとんどです。PCA9685のデータシートと回路図を参照しながら確認してください。初学者の方はsetup()の部分だけを見ておけばOKです。 ArduinoでI2C通信を使う時にはプログラムの最初にこの行を書きます。Arduino IDEにあらかじめ用意されている”Wire.h”というファイルに実際にI2Cをコントロールするプログラムが書かれていて、我々は簡単にI2Cを使えるようになっています。 ESP32のピンIO21,IO22にI2Cの機能を割り当てます。(参照:ESP32Dev Board PINMAP)100kHzの周波数で使用します。 サーボ駆動用のIC PCA9685をイニシャライズし、角度を設定します。角度はグローバル変数としてtempAngles[12]で保持しています。 IO19ピンをLOWにしてPCA9685を有効化します。(データシート P6) 今回はサーボを一度動かして終わりなのでloop()は何もしません。 PCA9685データシートのP10~P17を参照してください。 I2C通信はWire.beginTransmission(0x40)~Wire.endTransmission()で一区切りです。0x40はこのデバイス(PCA9685)のアドレスです。まずWire.write(6)でP10の表の6行目を指定します。forループの中のWire.write()はP10の表の6-9行目に対して実行され、サーボ#0(LED0と表記)のパルス立ち上がりタイミングと立ち下がりタイミングを指定します。 なお表の上の行から順番に実行されるのは、init_pca9685()の中でenable auto-incrementを指定していることによります。 サーボに与えるパルスは通常15-20msec周期でONパルス幅1.5msecで90°(センター位置)となります。init_pca9685()の中でPWM周波数を60Hzに設定していて1周期のカウント数が4095となっていますので、パルス幅が1.5msecとなるカウント数は369となります。プログラム中のangle=の式は、サーボの可動範囲のセンターが90°となるように実測して決めた変換式です。 forループでこれを12回まわしてすべてのサーボの角度を設定していきます。 ●往復運動させる loop()の中身を書き換えてサーボを往復運動させてみます。#0サーボ(P2コネクタ)のみ動かします。プログラムの意味はわかると思います。 #0サーボがセンター位置を中心に往復運動することを確認してください。そのままでは見えませんのでサーボホーンを取り付けてください。 ●デバッグの方法 サーボとは直接関係ありませんが、プログラムが思い通りに動かない時などに原因を調べるひとつの方法です。 上のプログラムに少し追加します。 このプログラムをメイン基板に転送して実行し、Arduino IDEの「ツール」->「シリアルモニタ」からシリアルモニタを起動します。Serial.print()に書いた内容が1000msごとに出てくると思います。(出てこない場合は画面下で9600bpsを選択)このように実行中のプログラムの状況を調べることができます。 最後にloop()の中をすべてコメントアウト(/* … */)して12個すべてのサーボを90°の位置に戻してサーボホーンを外しておいてください。 今回の成果は”mm03″などとして保存しておきましょう。

マイクロマシーン チュートリアル(2)

●メイン基板の準備 パーツボードからメイン基板(部品が載ったパーツ)を切り離します。 USBケーブルでメイン基板とパソコンを接続すると、USBシリアル変換ICのドライバがインストールされてプログラム開発ができるようになります。 ●最初のプログラム デスクトップのArduinoのアイコンからArduino IDEを起動します。 最初に二つの設定をします。メニューの「ツール」のボードで”ESP32 Dev Module”を、シリアルポートでメイン基板がつながっているポートを選択します。シリアルポートは、デスクトップ左下のWindowsアイコンを右クリックしてデバイスマネージャーを起動し、「ポート(COMとLPT)」から知ることができます。 まずは用意されているスケッチ例を使ってみます。LEDを点滅させるプログラムです。メニューの「ファイル」から「スケッチ例」-> 01.Basics -> Blinkを選択します。 プログラムの中で”LED_BUILTIN”となっているところ(3か所)を”14″に変更します。上の左側のチェックマークボタンをクリックして「コンパイルが完了しました。」と出たら、隣りの矢印ボタンをクリックしてプログラムをメイン基板のマイコンに書き込みます。「ボードへの書き込みが完了しました。」と出たのち、LED(D1)が1秒ごとに点滅すれば成功です。 ●プログラムの説明 Arduinoのプログラムは大きく二つの部分に分かれていて、void setup(){…}はマイコンのピンの割り当てなどを書くところで最初に1回だけ実行されます。void loop(){…}はマイコンにやらせる仕事を書くところで、上から順番に実行され下まで行ったらまた上に戻り、を永久に(電源が切られるまで)繰り返します。 pinMode(14, OUTPUT); の行は、Arduinoの14番ピンを出力(基本的にHigh(5V)とLow(0V)の電圧を出す)に設定しています。Arduinoのピン番号と実際の回路との関係は、 回路図 を参照してください。LED(D1)はマイコンのIO14というピンにつながっていて、それはArduinoではdigital pin 14という名称になっています。LEDについている抵抗R6はLEDに流れる電流を制限するためのものです。抵抗値が小さければ大きな電流が流れ(オームの法則)LEDが明るく光り、逆ならば暗くなります。 digitalWrite(14, HIGH); は14番ピンにHigh(5V)を出力しLEDを光らせます。 delay(1000); は何もしないで1000msec(1秒)待ちます。 digitalWrite(14, LOW); は14番ピンにLow(0V)を出力しLEDを消します。 delay(1000); は何もしないで1000msec(1秒)待ちます。 この後またdigitalWrite(14, HIGH);に戻ります。 ●練習問題 LEDを0.5秒ごとに点滅させてください。 *新しいプログラムは現在のプログラムの実行中でも矢印ボタンで上書きできます。 ここでいったんプログラムを保存しておきます。「ファイル」->「名前を付けて保存」で”mm01″などとして保存します。

マイクロマシーン チュートリアル(15)

●スマートフォンのアプリをつくる(iOS)  今回からiPhoneのリモコンアプリの制作となりますが、ゼロからすべてを作っていくのはハードルが高くなってしまいますので途中まで作成したサンプルプロジェクトにプログラムを追加していく方法となることをご了承ください。  iPhoneアプリの開発にはXcodeという開発環境を使いますので、お使いのmacにインストールしてください。(iPhoneアプリの開発にはmacパソコンが必要です。) Xcodeの基本的な使い方に関しては初心者向けの書籍等を参照してください。    次にこちらーBLEControllerーからサンプルプロジェクトをダウンロードします。zipファイルを解凍し、Xcodeからプロジェクトを開いてください。  左側の「BLEController」->「BLEController」->「ViewController.swift」を開きます。上のメニューから「Product」->「Build」でエラーが出ないことを確認します。  左側で「BLEController」->「BLEController」->「Main.storyboard」を開きます。こちらはアプリの画面の設定となります。下半分が空いていますがこちらには後ほど別の部品を追加します。  ViewControllerに戻って先頭のUUIDは、ESP32のプログラムに書かれていたものをそのまま記載します。これが違っているとマイコン側とスマートフォン側とで通信が成立しません。  プログラム30行目からの@IBActionには、ボタンがタップされたときの処理が書かれています。現在はスキャン、接続、切断、左旋回の処理のみでその他の処理は未記載です。左旋回(LTRN)の記載内容を参考に残りの部分のコードを完成させてください。Main.storyboardからcontrol+ドラッグしてボタンとアクションの関連付けを行います。(初めての方:xcode 紐付け で検索)  前回はBLEデータのやり取りを文字列で行いましたが、今回はBYTE配列を使います。(ESP32のプログラムも変更します。)実際のデータの送信は、プログラム下方のfunc write(byteValue: [UInt8]) で実行されます。  mm12bをもとに、ESP32側もBYTE配列でデータを受け取るように変更しmm15とします。

Page 2 / 11123»
PAGETOP
Copyright © Meuse Robotics All Rights Reserved.
Powered by WordPress & BizVektor Theme by Vektor,Inc. technology.