隠居エンジニアのものづくり

自転車 電子工作 ラジコン ロボカップジュニア CAD レーザー加工機

I2Cのノイズ対策 その1(準備編)

ロボット教室でロボカップジュニアにチャレンジしている生徒さん達からI2Cのトラブル対策について質問を受けることが増えてきました。

そのそもI2Cは、直径220mmの筐体内での通信に不具合がでるほど脆弱な通信規格ではありませんので、不具合原因を特定しましょう。

 

 

先ず、ノイズ以外の良くある定番不具合原因について、ご確認下さい。

①I2Cの電圧

TJ3B、TJ3-CORE、ArduioUNOを使っていてNucleoなどの高性能マイコンへ移行した方に多いパターンがセンサ流用でのトラブルです。

例えばダイセン電子製9DコンパスをそのままNucleoに接続するとNucleo側が3.3V、9Dコンパス側が5.0Vなので問題が起こります。

このトラブルは分かりにくい症状で、センサのレジスタセットアップが正常に済んでデータもそれっぽく出てきます。

 

プログラムについては”ダイセン電子工業さんのセンサをArduinoで使う”をご覧下さい。

ダイセン電子工業さんのセンサをArduinoで使う - 隠居エンジニアのものづくり (hatenablog.com)

 

"ArduioUNO - 9Dコンパス"のテストプログラム結果

方位 角速度 ピッチ ロールの順番にシリアル出力した結果です。

Opening port
Port open
62 -1 -113 380
62 -1 -113 381
62 -1 -113 381
62 -4 -114 381
62 5 -114 382
62 2 -114 382
62 2 -114 382
62 4 -113 382
62 0 -114 382
62 -2 -114 382

 

"Nucleo - 9Dコンパス"のテストプログラム結果

方位 角速度 ピッチ ロールの順番にシリアル出力した結果です。

Opening port
Port open
358 5 1698 103
358 1 1698 103
358 7 1698 103
358 65533 1698 103
358 2 1698 103
358 0 1698 103
358 65529 1698 103
358 65534 1698 103
358 10 1698 104
358 1 1698 103

 センサを固定しているので角速度は0付近を公差範囲でばらついたデータが出るのが正解ですが”飛び値”があります。

センサを動かして見ると方位や傾きもそれっぽくデータが変わるので”動作した”となるのですが、バッテリー駆動のロボットでは僅かな電圧降下でもデータ化けの頻度が上がりますし、モータのノイズも影響します。

そもそもギリギリアウトの状態です。

今一度、マイコンのI2C電圧とセンサのI2C電圧が同じになっているか確認して下さい。

 

②"Original Pixy"または "Pixy2 + Pixy1.0 compatibility mode"の使用

 サッカーオープンチャレンジの定番カラーイメージセンサですが、”Sig1”をカメラが捉えていると”Sig2”以降のデータ取得頻度が下がる問題を抱えています。

ですので、オレンジボールには確実に接近するのにボールをキャッチしてゴールに向かうプログラムに切り替わったとたんにクルクル回りだすとか、迷ってカクカク動くとかの症状を示します。

詳細は”PixyCAMを2色以上のターゲットに対して自動制御する時に、発生する問題について”をご覧下さい。

PixyCAMを2色以上のターゲットに対して自動制御する時に、発生する問題について - 隠居エンジニアのものづくり

原因の切り分けは簡単でオレンジボールをSig2に登録、青色ゴールをSig1に登録、プログラムをこれに合わせて修正します。

オムニビションなど後ろに視界のあるロボットは後方視界をテーピング等で見えない様にして、黄色ゴールとロボットの間にオレンジボールを置いてスタートします。

青色ゴールが見てない時は回転する等のしくみがない場合は、ボールキャッチしたら手動でロボットを青色ゴールに向けてあげます。

これで青色ゴールに向かう動作が正常化すれば確定診断です。

 

対処方法は

●ボールキャッチした時にオレンジボールがカメラから確実に見えないようになる筐体設計に変更する。

Pixy2 + Pixy2 modeで動作する様にプログラム変更する。

 

この2種類の不具合原因で8割は解決しています。

確認する価値はあると思いますのでお試しあれ。

 

残り2割の不具合原因については、またの機会に記事にします。

 

 

Nucleoでサーボモータを動かす

ボード選択の件は”NucleoでLチカ”を参照下さい重複説明部分は割愛致します。

サーボモータを下図ポートと接続してください。

f:id:Blackbox_crusher:20210110214007p:plain

f:id:Blackbox_crusher:20210110215012j:plain

 

Arduino IDEのスケッチ例にサンプルプログラムがあります。

Nucleo-64用のスケッチ例-Servo-”Sweep”を選択

f:id:Blackbox_crusher:20210110212944p:plain

ダウンロード完了後はサーボホーンが0度から180度までの回転を繰り返します。

USB給電で動作しますので大きなサーボモータは電流不足で動かない場合があります。

なるべくトルクの小さいサーボで動作確認することをお勧めします。

サーボモータによっては180度の可動域がない場合がありますので0度付近または180度付近でサーボモータから異音(ジーと言う感じ)がある場合は直ぐに停止してください。

 

サーボモータの制御信号規格はラジコン由来ですので、電動ラジコン用(前進-停止-後進)のESCをモータドライバ代わりに利用することが可能です。

ラジコンは基本的に±60度の規格ですのでプログラミング時には30度-150度で制御します。

Nucleoで超音波センサ

 ボード選択の件は”NucleoでLチカ”を参照下さい重複説明部分は割愛致します。

  超音波センサ(PING)を下図ポートと接続してください。

f:id:Blackbox_crusher:20210110183341p:plain

f:id:Blackbox_crusher:20210110184229j:plain



 

Arduino IDEのスケッチ例にサンプルプログラムがあります。

PING”を選択

f:id:Blackbox_crusher:20210107233725p:plain

Arduino IDEのスケッチ例”Ping”が超音波センサーサンプルプログラム

ダウンロード完了後はシリアルモニタで距離が見れます。

次はサーボモータを紹介します。

 

 

 

NucleoでLチカ

サンプルプログラムはマイコンボードのLEDを制御しますので、外付けの回路は不要です。

マイコンボードだけで動作確認ができます。

  (説明はNucleo F446REを使う前提で行います。)

 

Arduino IDEのスケッチ例にサンプルプログラムがあります。

Blink”を選択します。

f:id:Blackbox_crusher:20210110161738p:plain

 

ソースリストでLEDは予め設定されてます。

void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}

この”LED_BUILTIN”はボード毎のLEDピン配置に接続する定義が予め行われていますので、以下のボード選択手順を行えばソースリストは一切変更する必要なく動作が保証されます。

 

ボード選択

ボードから"Nucleo-64"を左クリック

f:id:Blackbox_crusher:20210110160936p:plain

次に"Board part number"でNucleoの型番を選択します。

f:id:Blackbox_crusher:20210110161054p:plain

 これでボードの選択は完了です。

マイコンボードに書き込む”ボタンを左クリックするとビルド・ダウンロードが始まります。

f:id:Blackbox_crusher:20210110163603p:plain

ダウンロード完了時にNucleoがストレージデバイスとしてWindowsに認識されますので下図の様にエクスプローラーが自動的に立ち上がりますが、無視して閉じて下さい。

f:id:Blackbox_crusher:20210110163419p:plain

真ん中位の緑色LED(LD2)が1秒間隔で点灯、消灯を繰り返します。

f:id:Blackbox_crusher:20210110165808j:plain

次は超音波センサ(PING)を紹介します。

 

マイコンボードNucleoをArduinoIDEで開発する方法での注意点!

NucleoをArduinoIDEで開発する際に注意が必要なポイントはPWM、外部割込み、I2Cなどの多機能ポートの位置です。

私もI2Cを動作させるのにとても苦労しました。

ArduinoUNOではSDA:A4、SCL:A5なのでNucleoでも同じ位置に接続して動作確認するもNG!

PING、Servoと順調に動作確認できていたので、”あれ?”となりました。

一番のハマりポイントだと思いますので気を付けて下さい。

F446REではSDA:D14、SCL:D15となります。

繋ぎ変えたらあっさり動作しました。

図の青色はNucleoネイティブのピンで、内側のピンクがArduinoUNO互換ピンです。

ArduinoUNO互換ピンを両脇に表形式で追記してありますので黄色の位置に注目して下さい。

f:id:Blackbox_crusher:20210110141211p:plain

マイコンボード毎に異なる可能性がありますので、必ず御自分のボードの多機能ポートの位置を調べて下さい。

高性能Armプロセッサ搭載マイコンボードNucleoをArduinoIDEで開発する方法

ロボカップジュニアでも一時期盛り上がったNucleoですが、開発ツール”mbed”がWebに接続するタイプであった為に、話題になる頻度が減った様に思います。

いざ本番の大会会場でWiFi禁止によってmbedが使えず苦戦を強いられたチームもあるようです。

最近メーカーであるSTマイクロもローカルで使える開発ツール”STM32CubeIDE”を無償配布してますが、使いこなすのは大変です。

Nucleo-64シリーズはピン配置もArduino互換になってます。

価格もリーズナブルなので、なんとか開発環境を改善したい所です。

 

ArduinoIDEを使う

 

ArduinoIDEをつかうメリットは

Arduinoを使っている人は”ボード指定”を変えるだけのお手軽さ

Arduinoのソフトウエア資産(過去に作ったソース)を使える

●Armプロセッサ上でpulseIn()、constrain()、map()、servo.attach()、servo.write()などのArduino便利関数が使える

 

ArduinoIDEをNucleo用に設定する

以下の手順を行えば、ArduinoとNucleoの開発環境の切り替えはボード選択を変えるだけです。

 

Nucleoをボードマネージャに追加

f:id:Blackbox_crusher:20210110120341p:plain

f:id:Blackbox_crusher:20210110120501p:plain

追加のボードマネージャのURL: へ下記URLをコピーして”OK”

https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json

f:id:Blackbox_crusher:20210110121902p:plain

STM32 Cores”を検索

 

バージョンを選択してインストール インストールには時間がかかります!

f:id:Blackbox_crusher:20210110122123p:plain

これでOKです。


Nucleoボード選択方法

Nucleo-64”を選択

f:id:Blackbox_crusher:20210110122435p:plain


Boardpart number:で使用ボード名を選択

f:id:Blackbox_crusher:20210110122618p:plain

シリアルポート:を接続したNucleoのCOMポートNo.に設定すれば設定完了!

f:id:Blackbox_crusher:20210110122727p:plain

これで、いつも通りにArduinoUNOにプログラミングしている感覚でストレスなくArmプロセッサのプログラミングができます。

ビルド時間が長くなるのでフリーズと間違えない様に、ビルド完了を待って下さい。

 

手元にあったNucleo L053R8、Nucleo F446REでの動作確認済みです。

ピン配置の互換性について若干の注意点がありますが、別の機会に記事にします。

学校の部活で3D CADを導入するには(ロボカップジュニアに取り組んで居られる指導者の方向け)

生徒さんに3D CADへの興味を持って貰うには加工機をセットで!

5ヶ所程の学校やロボット教室で出前授業をしましたが、”3D CAD講習会”を開いて後は独学で頑張ってという方式は殆ど効果が無いと実感しました。

3D CADの技術を手に入れるとリアルに部品を作る前にPC上で干渉チェックや組立順の不具合が確認できる(手戻りが減らせる効果)事をアピールするのですが、部品加工が手作業なので図面化が面倒くさいですし、図面化の操作まで講習するのは時間的に現実的ではありません。

ですので、3D CAD講習後に継続的にCADを独習してロボット全体をアッセンブリするまでのスキルを身に着ける方は極少数にとどまります。

 

ところが、気まぐれで某学校にレーザー加工機をレンタル設置したら、物凄いモチベーション!

10月初旬に設置しに訪問した際、”担当の先生と来年のロボット作りには3D CADで加工データが作れるようになったら良いですね(ブロック大会まで2か月ないタイミングだったので)”とお話したのですが、今年のロボットの機構が3D CAD設計&レーザー加工になっていました。

 

興味を持ったのは、特定の個人ではなく、部活全体で盛り上がってました。

その要因は?

レーザー加工機で部品を作る手順が簡単で機構担当以外の人も使えた

●部品加工時間が短い

●厚紙をレーザーカットして実際のサイズ感や穴位置・穴径の確認をしてからアクリルで本番の手順で失敗が少ない

●材料と非接触で加工するので加工中の脱調などによる失敗がない

 

仕事柄レーザー加工機、NCフライスのどちらも使うのですが、部活でNCフライスを導入するのは、お勧めしません。

理由は以下の通りです。

●部品を作る手順にノウハウがあり、導入直後は実運用に耐えない

●部品加工時間が長い(放課後の時間内で切削できない部品が出てくる)

●加工途中の脱調などによる加工失敗が生じやすい

●3軸NCフライスの場合、切削可能部品の自由度が低い

●固定部や支えが必要となるので材料の無駄が多い

●完全に切り落とせないので支えのカットなどの追加工・バリ取りの時間が必要

●エンドミルの破損・損耗、スピンドルモータの消耗、捨て板などの補材等、ランニングコストが高い

●加工時の騒音が大きい

●キリコが飛び散って大変

 

レーザー加工機の欠点として”レーザー加工は平板しか切れないので3D部品が作れない”と言う方が居られるので実例を一つ紹介します。

 

タミヤ製トラック&ホイールセットをギヤが露出していないプラスチックTTギヤモータで使いたい場合はシャフト形状が異なる為にスプロケットホイールを自作する必要があります。

3Dデータにするとこんな感じになります。

f:id:Blackbox_crusher:20210110021101p:plain

スプロケットホイールの3Dデータ

NCフライス用のツールパス作成をする必要がありますが、以下の様なデータで切削すると部品切削終了直前にエンドミルに部品が巻き込まれて飛んでいく危険があります。

f:id:Blackbox_crusher:20210110021708p:plain

支えなしの片面切削データ

正しくは以下の様に支えを付けて両面から切削する事を前提としたデータを作ります。

表面の切削完了後、裏面に材料を固定する際の位置決め精度など両面の位置関係が崩れない為のノウハウと実際に設置する技量が問われます。

切削予想時間は3時間50分です。

 

f:id:Blackbox_crusher:20210110021348p:plain

支えありの両面切削データ

切削終了後の支えのカット・仕上げ作業は手作業です。

 

 

以下は3D構造の部品をレーザー加工機で作る場合です。

f:id:Blackbox_crusher:20210110020640p:plain

レーザー加工機用3D CADデータ

CADデータ作成の際に接着作業の位置出しに使う平行ピンの穴を用意します。

5部品全て切削して2分19秒です。

f:id:Blackbox_crusher:20210110024308j:plain

平行ピンで位置決めをして溶剤型アクリル接着材を用いて接着する

この作業を行って完成したスプロケットホイールはこちら

f:id:Blackbox_crusher:20210110024548j:plain

プラスチックTTギヤモータ用スプロケットホイール

接着材は直ぐに剥がれるイメージがある様ですが、溶剤型接着材は強力です。

アクリル接着材の場合、剥がそうと思って力を加えると接着面と違う所が割れる位です。また接着材乾燥時間がとても早く瞬間接着剤よりよっぽど”瞬間”です。

5部品の接着作業時間は5分程度です。

 

レーザー加工機用の3Dデータ作成ノウハウ・製作ノウハウはまた別の機会で解説します。