別のロボットの作成の物語。 パート2、「生きている!」

ATmega16Aマイクロコントローラ上での簡単な車輪付きロボットの作成に関する一連の出版物を続けています。

私の出版物の後半では、ロボットの作成と組み立てのプロセスについて説明します。 プリント回路基板の製造から始めて、デバイスの最初のステップ(またはホイール回転)のビデオを終了しましょう。 また、Qtでの最初のPCプログラミング体験、つまりBluetoothを介してロボットとデータを管理および交換するためのプログラムの作成にも注意を払います。

必要に応じて、 最初の出版物に精通し、それがどのように始まったのかを知ることができますが、私は猫の下にいるすべての人に尋ねます。

画像



前の部分では、既製の回路基板レイアウトが目の前にありました。つまり、電子版から実際の具体的な世界にアイデアを作成し、転送するときです。 私の手には1mmのテキソライトしかなかったので、考え直すことなく、標準LUTを使用してトラックの画像をボードに転送するプロセスを開始しました。



写真の品質をおaびしますが、私の携帯は安いです...

画像



画像



次のステップは酸洗でした! 過酸化水素とクエン酸を使用した新しいエッチング方法を自分で試しましたが、この方法は確かに安全で非常に安価ですが、成分の割合に敏感すぎるように思えました。 ソリューションを使用したコンテナでの1時間の魔術操作の後、プロセスはまともな強さで進みました(ボードテンプレートを変更することができ、すべてがはるかに高速にエッチングされると言う価値があります)。



画像



画像



ボード上のトラックの80〜90%は良好でしたが、 ほとんどのトラックは0.2mmでしたが、はんだと細い導体で汚れを取り除いたので、ビアを作ってくれました。 一般に、はんだ付けプロセス全体は午後3時でした。



画像



画像



ボードと乗る必要のある表面との間に最大のクリアランスが必要であることに気付いたので、モーターをボードの下部に移動する必要がありましたが、それでもロボットは低着陸であることが判明しました。

そして、私たちはモーターを覚えていたので、エンコーダーのアイデアも覚えています。注文した磁石は文字通り直径がホイールの溝よりも直径0.5ミリメートル小さいため、何らかの方法でそれらを修正する必要がありましたが、独創的なものはすべてシンプルです-私はちょうどそれらをそこに連れて行き、接着剤銃で満たして、非常に審美的にではなく、迅速かつ実用的にしました。 主なことは、極性を混同しないことです。さもないと、枠は正確になりますが、すでに小さくなっています-ホイールあたり12個の磁石、つまり 1回転あたり6回の操作で、ホイール直径が43 mmの場合、1回の操作でホイールが移動する経路は約22 mmになります。



画像



次に、ボード上に高さの小さな間隔を空けて、どの方向に動いているかを理解するためにホールセンサーを配置しました。



画像



バッテリーを取り付けるために、サーボおよび超音波距離計は、最も単純な部品である3Dプリンターで印刷されました。



バッテリーホルダー。

画像



サーボホルダー。

画像



UZ距離計ホルダー。

画像



ファイルを使用して細部を微調整すると、すべてが適切に配置され、その結果、ロボットは次のようになりました。



画像



画像



そして、はい、それはただのビーズ、太いワイヤー上のビーズであり、これが唯一の未解決の「問題」の構造です。 実際、3番目のホイールの問題の解決策は取り上げませんでした。ホイールがバウンドしたり、サーボを回したりするために火がついたからです。

1 mm PCBを使用しているため、ロボットは壊れやすいように見えますが、質量が小さいため、強度と操縦性に影響しません。

まあ、私が最初にラインに乗りたかったのは、いわば、自動制御の最初の経験です。

私は職業としてプログラマーではないことをすぐに言わなければなりません、これはおそらく私の趣味の中で最も弱い点です。したがって、コードをあまり批判しないでください。いずれにしても、将来的にプログラム全体を書き換える必要があると確信しています。



PDアルゴリズムを実装したテストプログラムが作成されました。 ADC割り込みハンドラーとメインデータサイクル自体で構成されていました。



割り込みハンドラー
#define FIRST_ADC_INPUT 2 #define LAST_ADC_INPUT 7 unsigned int real_adc[8]={0,0,0,0,0,0,0,0}; unsigned char sample_adc; volatile unsigned char adc_ready = 0; unsigned char leds[8]={0x21,0x41,0x61,0x63,0x23,0x43}; unsigned char adc_inputs[8]={0,1,2,4,6,7,3,5}; interrupt [ADC_INT] void adc_isr(void) //////////////ADC_INT { static unsigned char input_index=0; if (adc_ready == 0){ if (sample_adc == 0) { real_adc[input_index]=(signed int)(ADCW); if (input_index < LAST_ADC_INPUT-FIRST_ADC_INPUT){ input_index++; } else { input_index = 0; PORTB=leds[input_index]; sample_adc = 1; } ADMUX=(ADC_VREF_TYPE & 0xff)+adc_inputs[(FIRST_ADC_INPUT+input_index)]; ADCSRA|=0x40; } else { if (adc_ready==0) { if (ADCW > real_adc[input_index]){ real_adc[input_index]=(signed int)(ADCW); } else { real_adc[input_index]=(signed int)(real_adc[input_index]); } if (input_index < (LAST_ADC_INPUT-FIRST_ADC_INPUT)){ input_index++; PORTB=leds[input_index]; } else { input_index = 0; adc_ready = 1; PORTB&=~(1<<0); } ADMUX=(ADC_VREF_TYPE & 0xff)+adc_inputs[(FIRST_ADC_INPUT+input_index)]; } if (adc_ready == 0){ ADCSRA|=0x40; } } } }
      
      







PIDの実装
 if (adc_ready == 1) { adc_l = (real_adc[1]+real_adc[2]); adc_r = (real_adc[3]+real_adc[4]); error = (adc_l-adc_r); delta_error = error - old_error; //sum_error += error; PID = Kp*error + Kd*delta_error + Ki*sum_error; old_error = error; if (PID > 0) { pwr_l += (signed int)PID ; pwr_r -= (signed int)PID ; } else { pwr_l += (signed int)PID ; pwr_r -= (signed int)PID ; } for(i=0; i < (LAST_ADC_INPUT-FIRST_ADC_INPUT)+1; i++){ real_adc[i]=0; } ADCSRA |= 0x40; adc_ready = 0; sample_adc = 0; }
      
      









ロボットが割り当てられた機能を果たしていることを見てとてもうれしかったです。完全に滑らかで高速なラインフォワーダーを備えたクールなビデオほど確実ではありませんが、私にとってもそのような結果は成果でした。







その後、マイクロコントローラー自体のプログラミング部分で少し落ち着き、将来的にはPCからロボット制御プログラムを実装する必要があり、Qtの学習を開始することに気づきました。最後のPCプログラムは大学(Pascal)でしか書いていなかったので、コンピューター科学の標準的な研究室でしたが、私の知識はゼロの領域にありました。



オフトピック、スマートフォンからロボットを制御するための私の壮大な計画と、このアイデアをあきらめて得点した方法について
実際、最初からAndroidで携帯電話用のプログラムを書きたくなりましたが、Javaを学びたくはありませんでした。むしろ、Cを離れたくはありませんでした。 最初は、Qbluetoothでの作業と、中国語のJiayu g3を使用したHC-05とのドッキングの禅を自分で理解しようとしましたが、HC-05とJiayuが友達を作るのを妨げる問題に出くわしました。 最初、彼はQbluetoothとHC-05を認識しないという事実に罪を犯しましたが、インターネット上で、人々が苦労して友人に苦情を申し立てた後、QBluetoothを使用してbluetooth HCモジュールのラインを介してデータ交換を開始するか、ライブラリを作成するという情報を見つけましたある日、私はプログラムを書き、それでもロボットとデータを交換することができましたが、残念ながらタブレットを使用していました。 その結果、私の中国語がrfcommをサポートしていないという事実ですべてを正当化したので、私はあきらめて、PC用にすべてを書くことにしました。





このプログラムは、ロボットの動作モード(ライン、キーボード制御、自律モードに従う)を切り替え、対象のすべてのセンサー(サーボ、ラインセンサー、超音波距離計、モーター、エンコーダー)からデータを発行(設定)することになっています。

数週間後、ロボットコントロールパネルプログラムの最初のバージョンが作成されました。 QtでGUIを操作するのは本当に便利でした。



画像



Cのモックで禁止されないように、プログラムのコードを挿入しないほうがいい 手短に言えば、プログラムは単にそれをピックアップし、QSerialPortのデータ可用性のシグナルによってラベルとウィジェットに送信し、必要に応じて、タイマーに応答して、サーボの位置やモーターの速度などの設定データを送信します。 プログラムの緑の野原は夢の中にあります-ロボットの前の未来の位置地図です。



プログラムはすべての利用可能なデータを受け入れ、一時的にデバッガーとして機能します。 私はまだキーボード制御を実装していません。自律モードは非常に湿っていて、ロボットは障害物を見るだけで、与えられた角度で向きを変え、新しい方向に離れようとします。 一般に、私が言ったように、プロジェクト全体はプログラム部分でまだ湿っています。



将来的には、MKとPCの両方のプログラムを完全にやり直す必要があるという理解によって多少抑制された野心的な計画を実装したいと思います。構造化システム。 しかし、それは趣味の意味であるため、主なことは、あなたが頭の中で計画したことが物質世界で実現されなくなるまで、あきらめずにさらにやることです。



追伸 将来的には、いわば、プログラムの部分に進むにつれて、出版物の別の部分を書くようにします。



All Articles