自律ロボットFrankの作成。 パート3





前回の記事から多くの時間が経過しました。 フランクは大きく変わりました。 もちろん、彼は独立したわけではありませんでしたが、実験用のプラットフォームはほぼ準備ができていると言っても差し支えありません。レゴやはんだごてを使用するよりもコードを書くのに多くの時間を費やします。



最新の記事を読んでいない人は、次のリンクをクリックして読むことをお勧めします。 このプロジェクトを既に知っている人のために-catへようこそ。



「自律型ロボットFrankの作成。 パート1

「自律型ロボットFrankの作成。 パート2







まず、フランクの仕事の原理が完全に変わりました。 彼は4つの車輪から4つのトラックに移動し、コードの管理と作成を非常に容易にしました。 シャーシとシャーシの組み立て方法により、内部に電子機器を配置する余地がまったくありませんでした。 内部に収まるのは、ホイールを回転させて回転角を担当する6vバッテリーと4reサーボモーターだけでした。 2番目の試みは、回転機構を完全に取り除き、車輪の速度を差別化して制御に切り替えることでした。 車輪と床の間の摩擦により車輪が少し滑ることができなかったため、このベンチャーも失敗しました。追加のギアの助けを借りて達成したのは、実験の終わりに滑ってすぐにビンに入れられたギアだけでした。







キャタピラーを使用すると、すべてがシンプルになりました。 レゴのラバートラックはかなり低品質であるという事実にもかかわらず、ギアボックスはその役割を果たしました。 もちろん、フランクはレースに参加することはできませんが、明らかに彼は荷物を引きずることに成功します。







そこで、すべてをフランクに入れ、すべてを1つのケースに集めて、いくつかの変更を加えることにしました。 第一に、私はまだカメラとステレオビジョンで実験したかったです。 第二に、カメラの代わりに素早く何かをする必要がありました。そうすれば、彼は少なくとも自分の周りの世界についてある程度の考えを持つことができました。 それで彼の頭が生まれました。







私の頭の中で、私は2台のカメラを修正しましたが、これらのカメラはこれまで、いかなる方法でも超小型回路に接続されていません。 超音波センサーとサーボモーターがその中に入り込み、ヘッドが回転できるようになりました。







バッテリーを手に入れたので、USBケーブルでラップトップに接続しないという意味で、完全に自律的になりました。 すべての通信は、シリアルワイヤレスポート(先ほど書いたXBee)を介して行われます。 Arduino Dueを数えると、これだけでなく、さらに3種類のマイクロサーキットを変更しました。







発生した変更は次のとおりです。



1)最終的にXBeeを回路にはんだ付けしました。 今ではデバイスの一部です。

2)楽しみのために、そこに温度センサーを置きます。

3)4つのサーボ、超音波センサー、バッテリー、3つのソーラーパネルの入力を行いました(キューはまだ到達していません)

4)レゴ用の何らかのセンサー(コンパスやジャイロスコープなど)を突然接続する必要がある場合、NXTインターフェイスを1つ持ち出しました

5)すべてが1つのバッテリーで動作するようになったので、外部スイッチを作成し、サーボモーターの「ノイズ」を取り除くためにコンデンサーをはんだ付けしました。

6)バッテリーとソーラーパネルの接続は外部ボード上にあり、電源配線自体(まだ完成していない)は平均的であるため、それらの間に追加の接続を行いました。

7)電圧を測定するために、アナログ入力の1つにバッテリー電源を入れました。







当然変更されたソフトウェア!



前回と同様に、 フランクサイト-Autonomous Vehicleからダウンロードできます。



ソフトウェアの何が変わったのですか?



サードパーティのライブラリを使用してXBeeを介してArduinoと通信しようとした方法は、根本的に間違っていました。 すべてがはるかにシンプルであることが判明しました。 組み込みのシリアルライブラリを使用して、すべてが動作し、送信され始めました。 わずかなニュアンスがありますが、それらについては後で説明します。



現在、iFrankで現在利用可能なすべてのデータを送信します。

1)バッテリー充電

2)最も近い物体までの距離(超音波センサーを使用)

3)温度

4)サーボモーターを制御するための現在の変数。



不必要な作業でArduinoをロードしないように、データに関連するすべての計算はiFrankで行われます。 次に、iFrankはデータの監視に従事しており、データを変更する必要がある場合は、更新を送信します。 したがって、ヘッドの回転とサーボモーターの制御が機能します。 iFrankでキーを押してヘッドの回転を制御する場合、iFrankがArduinoに伝えてデータを変更するため、「望ましい」データと現在のデータの間に矛盾があります。 iFrankには、この差をスムーズに変更し、実際に目的の信号を送信するタイマーもあります。



iFrankとArduinoのコードでわかるように、信号の最後にシンボル「*」(arduino-> iFrankの場合)および「\ n」(iFrank-> arduinoの場合)を送信します。 シリアルポートから読み取るとき、情報は断片的になるため、iFrankでは情報が入るバッファーを整理しました。 非同期タイマーは定期的にそこから情報を読み取り、「*」で区切られた断片で処理します。



以下はArduinoコードです。



Arduinoコード
#include <Servo.h> #include <math.h> //Sensors int dataTemperature = 0; int dataBattaryVoltage = 0; int dataSolarVoltage = 0; int dataMotor1 = 0; int dataMotor2 = 0; int dataSteering1 = 0; int dataSteering2 = 0; int dataCamPan = 0; int dataCamTilt = 0; int dataGyrX = 0; int dataGyrY = 0; int dataGyrZ = 0; int dataAccX = 0; int dataAccY = 0; int dataAccZ = 0; int dataGPSTime = 0; int dataGPSLong = 0; int dataGPSLat = 0; int dataGPSSat = 0; float dataDistance = 0; int dataTemp2 = 0; int dataTemp3 = 0; int dataTemp4 = 0; int dataTemp5 = 0; int dataTemp6 = 0; int dataTemp7 = 0; int dataTemp8 = 0; #define trigPin 31 #define echoPin 30 //Voltage const float referenceVolts = 3.3; const float resistor1 = 20000; const float resistor2 = 2200; const float resistorFactor = resistor2/(resistor1+resistor2); const float boardVoltage = 3.3; const float analogVoltMult = boardVoltage/1024; const int batteryPin = 1; // Servo Code Servo steering1; Servo steering2; Servo motor1; Servo motor2; // Steering initial states float st1_start = 0.0; float st1_end = 180.0; float st1_step = (st1_end-st1_start)/256.0; float st2_start = 0.0; float st2_end = 180.0; float st2_step = (st2_end-st2_start)/256.0; // Steering function 0-256 float steer1(float p){ float v=st1_start+st1_step*p; steering1.write(v); return v;} float steer2(float p){ float v=st2_start+st2_step*p; steering2.write(v); return v;} int pos = 0; // XBEE Code /** XBee xbee = XBee(); unsigned long start = millis(); uint8_t payload[] = { 'H', 'i','t','h','e','r','e' };; Tx16Request tx = Tx16Request(0x4000, payload, sizeof(payload)); TxStatusResponse txStatus = TxStatusResponse(); */ void setup() { // Serial Serial.begin(19200); // Sensors pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // Servos steering1.attach(2); steering2.attach(3); motor1.attach(4); motor2.attach(5); dataMotor1 = 94; dataMotor2 = 94; dataSteering1 = 130; dataSteering2 = 130; } void loop() { // Read serial input while (Serial.available() > 0) { int st1 = Serial.parseInt(); int st2 = Serial.parseInt(); int mt1 = Serial.parseInt(); int mt2 = Serial.parseInt(); if (Serial.read() == '\n') { dataSteering1 = st1; dataSteering2 = st2; dataMotor1 = mt1; dataMotor2 = mt2; } } // Read temperature dataTemperature = analogRead(0);delay(15); dataTemperature = analogRead(0); dataBattaryVoltage = analogRead(1);delay(15); dataBattaryVoltage = analogRead(1); Serial.print(dataTemperature);Serial.print("|"); Serial.print(dataBattaryVoltage);Serial.print("|"); Serial.print(dataSolarVoltage);Serial.print("|"); Serial.print(dataMotor1);Serial.print("|"); Serial.print(dataMotor2);Serial.print("|"); Serial.print(dataSteering1);Serial.print("|"); Serial.print(dataSteering2);Serial.print("|"); Serial.print(dataCamPan);Serial.print("|"); Serial.print(dataCamTilt);Serial.print("|"); Serial.print(dataGyrX);Serial.print("|"); Serial.print(dataGyrY);Serial.print("|"); Serial.print(dataGyrZ);Serial.print("|"); Serial.print(dataAccX);Serial.print("|"); Serial.print(dataAccY);Serial.print("|"); Serial.print(dataAccZ);Serial.print("|"); Serial.print(dataGPSTime);Serial.print("|"); Serial.print(dataGPSLong);Serial.print("|"); Serial.print(dataGPSLat);Serial.print("|"); Serial.print(dataGPSSat);Serial.print("|"); Serial.print(dataDistance);Serial.print("|"); Serial.print(dataTemp2);Serial.print("|"); Serial.print(dataTemp3);Serial.print("|"); Serial.print(dataTemp4);Serial.print("|"); Serial.print(dataTemp5);Serial.print("|"); Serial.print(dataTemp6);Serial.print("|"); Serial.print(dataTemp7);Serial.print("|"); Serial.print(dataTemp8); Serial.print("*"); steer1(dataSteering1); steer2(dataSteering2); motor1.write(dataMotor1); motor2.write(dataMotor2); delay(100); // Read echo long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); dataDistance = pulseIn(echoPin, HIGH); }
      
      









フランクの写真














All Articles