fc2ブログ

Snake Robot No.2 White Snake その1

White Snake 2021年3月26日
今回の作品はコントロール部のマイコンにESP32 devkitを使ったので部品点数が減りました。
また、コントローラーにスマホアプリBlynkを使いBluetooth(BLE)にてコントロールします。
(Blynkは低電力のBLEが使え、AndroidとiPhoneの両方をサポートしているのが特徴です)。
1号機と比べ、サーボモータの取り付け方法変更とサーボモータを2個減らしています。
WhiteSnake5.jpg

SG90サーボモータについて
1号機を作る際に手持ちのSG90サーボモータを採寸して設計したのですが、届いたSG90は新しいタイプで
寸法が異なるので少し手を加えて使いました。 外見からの見分け方は、裏蓋の止めネジが対角に2本で、
旧タイプが四隅に4本です。 サーボホーンも厚みが有り、勘合するシャフトも少し太いのが特徴です。
裏蓋を外すと画像のようにモータやポテンションメータの接続が配線ではなく全て基板化されていました。
今回も同じ販売店に注文したのですが、届いた品は旧タイプだったので1号機と2号機のサーボモータを
入れ替えて使うことにしました。 このために掲載が少し遅くなりました。
これから作られる方は現物に合わせた設計と加工が必要なので注意して下さい。
SG90_servo.jpg

アクリル板の加工とユニットの組み立て
今回もアクリル板をCNC加工して構成部品を作りました。
WhiteSnake_001.jpg

組立図
先の1号機ではサーボモータをフレームに固定してたが、今回はサーボモータ固定台をフレームに対して±約5度の
遊びを持たせ、路面に少し凹凸があっても車輪が接地するように工夫しました。
assembly.gif

1ユニットの構成部品と組み立てた1ユニット
サーボモータと固定台はネジ止めで、下部サポート台のみ両面テープで貼り付けています。
WhiteSnake_002.jpg

コントロール部
WhiteSnake6.jpg

DOIT社のESP32 devkit V1を組み込み、測距センサー用サーボモータの下側からmicro USBプラグを抜き差し
出来るようにしています。
WhiteSnake_008.jpg

DOIT社のESP32 devkit V1は固定用の穴が四隅に開いているので、ピンヘッダを上向きに付け替えて固定します。
同等のセカンドソース品が安く出回っていてAmazonにて購入できます。
WhiteSnake_009.jpg

GPIO機能表
30Pinと38pinの2タイプありますが、30pinの方が少し小さいのでこれを使いました。
ESP32-DOIT-DEVKIT-V1.png

回路図
コントロール部の電源は3.7Vのリポバッテリー出力をDC/DCコンバータにより、5Vに昇圧してdevkitに供給しています。
駆動用サーボモータの電源は別電源として単4型ニッケル水素充電池を4個直列にして使いました。
測距センサーはシャープ製GP2Y0E03をI2C接続にて使用、センサー用サーボモータの電源はコントロール電源を使用。
WhiteSnakeCircuit_A.gif

電源部
単4型充電池を使ったサーボモータの電源部、容量の目安にデジタル電圧計を付けてみました。
また、既製品の電池ボックス・リード線が細いのでAWG20に交換して使っています。
WhiteSnake7.jpg

1号機のBlack Snakeと合わせて2台となりました。(1号機もサーボモータ取り換えに際し少し改良しています)。
WhiteSnake4.jpg


次回はスマホアプリBlynkを使ったコントローラーを掲載の予定です。

皆様の参考になれば幸いです。
by Paradise
スポンサーサイト



テーマ : 電子工作
ジャンル : 趣味・実用

White Snake

次回から掲載のWhite Snakeについて
前回の作品は、コントローラーに専用BLEリモコンを使ってましたが、今回はスマートフォンを使います。
使用するアプリには、AndroidとiPhoneの両方がサポートされたBlynkを使います。
また、マイコンも前回のように自分でボードを組み立てるのではなく、汎用のESP32 devkitを使うので
このブログを参考に製作される方の負担が軽くなると思います。
WhiteSnake1.jpg


次回から改良型の2号機「White Snake編」を順次掲載の予定です。

皆様の参考になれば幸いです。
by Paradise

テーマ : 電子工作
ジャンル : 趣味・実用

Snake Robot 蛇型ロボット その6

その6 ソフトウェア編 2021年3月9日

その1で紹介しましたが、このSnakeRobotの原型は2017年4月23日にjoes氏がinsutructables circuitsに
公開された作品です。 それを小型で入手可能な部品に置き換えてリメークしたのがこの作品です。
ioes氏のinstructables SnakeRobotページを開きます。
製作される方は、上記ページにハード面、ソフト面共に詳しく説明されていますので熟読して下さい。
SnakeRobot_01a.jpg

主な使用部品と構成の変更
マイコン : ATmega2560 → ESP32
リモコン : RFリモコン一対(技適認証なし、日本国内使用不可) → ESP32内蔵Bluetooth LE
サーボモータ : ASM-RGS-13を12個使用 → マイクロサーボSG90を14個使用
測距センサー : Sharp GP2Y0A41SK0F(analog出力) → Sharp GP2Y0E02( I2C出力を使用)

SnakeRobot Paradise Modelのファームウェア
使用部品と構成の違いに合わせ、元のファームウェアから大きく変更しています。
また、このファームウェアは前回その5に掲載の専用BLEリモコンとセットで使うことを前提にしています。
現在製作中の2号機「White Snake」では、Androidスマホ用フリーアプリ「Bluetooth Serial Controller」にて
コントロールしています。 スマホでコントロールをお望みの方は次回の2号機掲載をお待ちください。
このブログではArduinoIDEのinoファイルを直接添付できません。
右のtxtファイルを開き、コピーしてArduino IDEに貼り付けて下さい。 SnakeRobot_BLE_A.txt

ファームウェアの変更ポイント
説明用行番号付きHTMLファイルにて順次説明します。 SnakeRobot_BLE_A.html

1)ライブラリーの取得とアドレスの設定005-010行
#include "BLEDevice.h" // Ver.1.01 Ver1.01の取得先URL
#include "ESP32Servo.h" // Ver.0.90 Ver.0.90の取得先URL
#include "Wire.h" // I2c 標準ライブラリー
#define ADDRESS 0x40 // SHARP GP2Y0E03 is a distance measuring sensor unit,I2C address.
#define SHIFT_ADDR 0x35
#define DISTANCE_ADDR 0x5E

2)各変数の宣言 
012-042行:サーボモータ名とGPIOの指定
043-045行:ESP32ServoLibrarieの設定値(SG90対応)
046-052行:SnakeRobotの制御設定値。私は測距センサーをコントロールボード側に配置して前後を逆に設定。
このため、rightOffse、lestOffsetが±を反対に設定しています。defaultは5
053-067行:各サーボモータの角度補正値(実測にて要補正)
068-069行:delayTimeの設定、068行のdelayTimeを変えると蛇行する振幅が変わります。defaultは7
070-073行:ModeLEDのGPIOの設定、CAL_SWのGPIOの設定
074-082行:測距センサーの設定値関係、74行wallDistanceTolerance = 30は30㎝に設定してます。

3)BLE通信UUIDとDevice名 084-141行
BluetoothLEに必要なUUIDを入力しますが、BLE専用リモコンに合わせて同じコードを入力します。
Device名(ここではesp32_BLE)も同様です。

4)void setup 143-218行
Arduinoのservo.hと違ってESP32Servo.hは設定項目が多いですが、SG90サーボモータを問題なく動かせます。
181-196行:全てのサーボモータの角度を初期状態にします。
198-206行:測距センサーアドレスの初期設定です。
209-217行:BLEの初期設定。

5)void Forward(),void Backward(),void Turnleft(),void Turnright() 220-370
上記はloop内の行数が多くなるのでサブルーチンとして外に出しました。
これらはロボットを前後左右に動かすためのルーチンで、手動操作の場合はリモコンのボタンを1回押すと
1行程進みます。 この1行程の開始と終わりの姿勢は同じで、ボタンを押し続けると連続した動きとなります。

6)void Calibrate() 372-387行
CALスイッチをONにした状態において一直線ではなく左右何れかへ湾曲する場合、052行のoffset = 0を
±に少し値を変えて一直線となるように補正します。一直線でない場合は直進時に左右何れかへカーブします。

7)void Autonomous_Mode() 389-448行
自律モードの場合、IR測距センサーをサーボモータで左右に振り、障害物を検知します。
390-408行:170度の位置にサーボモータを振り、この時の障害物迄の距離を測定します。
410-428行:10度の位置にサーボモータを振り、この時の障害物迄の距離を測定します。
430-447行:左右の測定値を比較して進行方向を求め、一行程後退した後に左又は右に2行程旋回します。

8)void Received_Code() 450-494行
ペアリングしたBluetoothLEリモコンからの信号を受信してキャラクターコードに変換します。
変換したキャラクターコードにより選択された操作信号を出力します。

9)void loop() 496-528行
497行:Received_Code()を実行
498行:CAL_SWがONの場合はCalibrate()を実行
503行:自律操作モードの場合は前方の障害物を検知し、30㎝以内に障害物がある場合には
Autonomous_Mode()を実行し、障害物がない場合は1行程前進して同じ動作を繰り返します。


ファームウェアは改良のためにその都度変更を行います。その場合はこのページに追加掲載しますが、
この記事を参考に作られる方は、独自に改良してお楽しみください。


最後にもう一度動画をご覧下さい。



次回から改良型の2号機「White Snake編」を順次掲載の予定です。

皆様の参考になれば幸いです。
by Paradise

テーマ : 電子工作
ジャンル : 趣味・実用

Snake Robot 蛇型ロボット その5

その5 リモコン部の製作 2021年3月3日

手動操作やモード切替を行うリモコンにはBluetooth(BLE)を使った専用リモコンを使います。
このリモコンは昨年5月30日に「Theo Jansen Mechanism series No.9 その5」に掲載と同じものです。
ESP32_BLE_Controller.jpg

BLE(Bluetooth Low Energy)専用リモコン
リモコンにはスマホも使えますが、幼児でも操作が出来る専用リモコンを作りました。
Bluetoothのスマホアプリを使う方法は続編の2号機(White Snake)にて説明の予定です。

専用リモコンの回路図
TJ9_BLE_Control Circuit

タクトスイッチを使ったクロスキーボード
下がユニバーサル基板にタクトスイッチとシーソー式の十字板を組み合わせた物です。右側のシーソーボタンは
手動モードと自律モードの切替に使います。 シーソー板は大きく見えますが短辺8㎜、長辺24㎜です。
TJ9_CrossKey1b.jpg

リモコンの内部
ケースは5㎜厚のアクリル板をCNC加工して作りました。ケースの中身は3.7Vリチウムイオン電池と
ESP32だけですが、 プログラムの書き換え用ソケットを設けています。
TJ9_CrossKey3b.jpg

オリジナルBLEリモコンのソースファイル
UUIDはhttps://www.uuidgenerator.net/version4のOnline UUID Generatorにて取得し、受信側と同一コードとします。
UUIDの取得

以下を コピーしてArduino IDEに貼り付けて下さい。


/*I referred BLE notify from the sketch example of ESP32 BLE Arduino.*/

#include "BLEDevice.h"
#include "BLE2902.h"

BLECharacteristic *pCharacteristic;
bool deviceConnected = false;

char val;

//Get your UUID from Online UUID Generator.
//https://www.uuidgenerator.net/version4
#define SERVICE_UUID "********-****-****-*****-************"
#define CHARACTERISTIC_UUID "********-****-****-*****-************"
#define DEVICE_NAME "esp32_BLE"

class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};

void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};

void setup() {
Serial.begin(115200);
pinMode(12, INPUT_PULLUP); //Forward_SW
pinMode(13, INPUT_PULLUP); //Backward_SW
pinMode(14, INPUT_PULLUP); //Left_SW
pinMode(25, INPUT_PULLUP); //Right_SW
pinMode(26, INPUT_PULLUP); //SW_1(Autonomous operation)
pinMode(27, INPUT_PULLUP); //SW_2(Manual operation)
BLEDevice::init(DEVICE_NAME);
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY |
BLECharacteristic::PROPERTY_INDICATE
);

pCharacteristic->addDescriptor(new BLE2902());
pService->start();
pServer->getAdvertising()->start();
Serial.println("Waiting a client connection to notify...");
}

void loop() {
int val_F = digitalRead(12);//Forward
if (val_F == 0) {
val = 'F';
}
int val_B = digitalRead(13);//Backward
if (val_B == 0) {
val = 'B';
}
int val_L = digitalRead(14);//Left
if (val_L == 0) {
val = 'L';
}
int val_R = digitalRead(25);//Right
if (val_R == 0) {
val = 'R';
}
int val_1 = digitalRead(26);//Autonomous operation
if (val_1 == 0) {
val = '1';
}
int val_2 = digitalRead(27);//Manual operation
if (val_2 == 0) {
val = '2';
}
int val_S;
if ((val_L & val_R & val_F & val_B & val_1 & val_2) == 1) {
val = 'S';
}

if (deviceConnected) {
Serial.printf("*** NOTIFY: %d ***\n", val);
char buffer[10];
sprintf(buffer, "%d", val );
pCharacteristic->setValue(buffer);
pCharacteristic->notify();
}
delay(200);
}



次回はその6 本体のソフトウエアーについて掲載予定です。

皆様の参考になれば幸いです。
by Paradise

テーマ : 電子工作
ジャンル : 趣味・実用

プロフィール

CNC_Paradise

Author:CNC_Paradise
木工・彫刻・機械工作・電子工作が
大好きで自作のCNCを使って工作を
楽しんでます。

最新記事
最新コメント
月別アーカイブ
カテゴリ
何でも工作室
検索フォーム
RSSリンクの表示
リンク
QRコード
QR