FC2ブログ

Marble Robot (マーブルロボット)その2

マーブルマシン部とアームロボットの製作例
2021年5月10日 
画像や図はクリックすると拡大します。
MarbleRobot_01.jpg

マーブルマシン部の設計略図
今回もアクリル板の端材をCNC加工して部品を作りました。 アクリル板は、厚さ1㎜、2㎜、3㎜、5㎜を使います。
3個のビー玉が各スロープを一巡してホールに戻るまでの時間は、スロープの勾配が大きく関係します。
勾配が大き過ぎるとフェンスを乗り越えたりホールを素通りし、勾配が緩すぎるとセパレータに引っ掛かり止まります。
遅滞なくスムーズに動かすのは難しいと思いますが、その分作り甲斐があります。
尚、ビー玉の大きさは12.5㎜を使っています。

Design_sketch.gif

アームロボットの部品略図と組み立て図
サーボモータにはSG90を2個とメタルギアのMG90を使いました。
MG90を使った理由は、SG90のメインシャフトが遊びが多く「ぐらつき」が有るので負荷のかかるPanとアーム2に
使用しました。 先端の手(Hand)はビー玉専用のループ状としました。 Handの材料は書類バインダーの表紙
(厚さ1.6㎜)を使い、先端ループの内径が10㎜です。
ARM Robot Parts

本体内部について
本体の内部に制御基板やセンサー(フォトインタラプタ)とバッテリー電源を配置するのでスペースを確保します。
詳細は制御部で説明します。
bottomView.jpg

フォトセンサーの取り付け例
今回使ったフォトインタラプタは、以前に友人から頂いたもので製品名が不明でしたがパナソニック製と判りました。
型番はCNZ1023(ON1023)で秋月電子で1個20円で購入できます。 この製品の仕様書ではVccが5Vですが、
私が試したところ3.3Vでも問題なく動作します。
fotinterrupter.gif

マニピュレータ部の製作例
マニピュレータは、完成時には必要ありませんが、プログラムを作る時にサーボモータの角度情報の取得に
必要となります。 私はアクリル板をCNC加工して作りましたが、ベニヤ板などで簡単に作ることが出来ます。
但し、アームロボットの関節の長さと同じサイズに作る必要があるので注意して下さい。
この作品では、ビー玉を掴む手の開け閉めにサーボモータを使っていますが、単にON-OFFの動作なので、
ポテンションメータではなくタッチスイッチ(下画像第一関節の赤い板)を使いました。 詳細はソフト編で説明します。
MarbleRobot_Manipulator.jpg

マニピュレータ部の部品図
セットカラーには、2.5㎜の下穴にM3のタップ加工をします。
Manipulator1.gif

マニピュレータ部の組み立て図
各アームとVR(ポテンションメータ)の取り付けにt5アクリル板を加工したセットカラーをアクリル接着液で固定します。
また、VRのシャフトとセットカラーの固定はM3セットスクリューを使います。
Manipulator2.gif

最後にもう一度動画をご覧下さい。
アームロボットがビー玉を忙しく運び、スムーズに循環する様子をお楽しみください。




次回は制御回路を掲載の予定です。
by Paradise


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

スポンサーサイト



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

Marble Robot (マーブルロボット)その1

マーブルロボットの動画が出来ましたのでご覧下さい。
2021年5月4日 (字幕は英語と日本語を切り替えれます)。



次回は製作と制御回路を掲載の予定です。
by Paradise


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

次回プロジェクトMARBLE ROBOTのお知らせ

マーブルマシンとアームロボットを組み合わせたMARBLE ROBOTを作りました。
2021年5月1日完成

サーボモータを4個使用したアームロボットで、STM32F103マイコンにてコントロールしています。
MarbleRobot_1.jpg

これまでに木製とアクリル板製のマーブルマシンを数台作りましたが、今回はサーボモータを使ったアームロボットが
アーム先端の手(丸いわっか)でビー玉を拾い、上側のスロープ台へ運びます。
ビー玉がスロープを転がり、ジグザグスロープからセパレータ・スロープで行き先を選別され、下部の3ヶ所の穴(hole)
(画像でビー玉が止まってる場所)へ収まります。
holeには、フォトインタラプタを使ったセンサーを仕掛けていて、ビー玉がholeに入るとマイコンへ信号を送ります。
そしてアームロボットをそのholeへ移動させてビー玉を回収し、上側のスロープ台へと運びます。
holeが3ヶ所有り、同時に3個のビー玉を動かすのでアームロボットは休む暇もなく忙しく動きますが、ビー玉の
回収率は100パーセントです。

MarbleRobot_2.jpg

今回は画像による予告のみですが、次回は動作がよく判る動画をご覧頂きます。
また、製作図やソフトウェアも順次掲載の予定です。


by Paradise


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Snake Robot No.2 White Snake その3

その3 ソフトウェア編 2021年4月7日
このSnakeRobotの原型は2017年にjoesinstructablesがinsutructables circuitsに発表された作品を参考にしています。
ここにハード面・ソフト面共に詳しく解説されています。興味のある方は製作の前に塾続して下さい。

先ずは、White Snakeの動画をご覧下さい。


コントローラにBlynkを使います。
先の1号機では専用の自作BLEリモコンを使いましたが、White Snakeでは汎用性を考慮してスマートフォンアプリ
Blinkを使ったコントローラーを使います。
BlynkはBluetoothLEに対応していて更に、OSがAndroidとiPhpneのスマートフォンを共にサポートしています。
Blynk APPをAndroid版はGoogle PlayにてBlynkを、iPhone版はAPP StoreにてBlynk - IoT for Arduino, ESP32を
夫々ダウンロードとインストールを済ませておきます。

Blynkを使ったソースファイル
ArduinoIDEに張り付け用の行番号なしのファイルはこちをクリックすると開きます。⇒ WhiteSnake.txt

使用するサーボモータの特性やServo libraryの関係でハード的に90度に正しく設定していても左右どちらかへ偏る
ことが有り、ソフト面これを補正する必要があります。
また、IRセンサーの感知角度が狭いことや車型ロボットと違って蛇行しながら進むので障害物感知が難しいと思います。
このソースファイルは私のWhite Snake用で、新たに作られる方はそのロボットに合わせた変更が必要です。

以下に要点のみ注釈を付けました。
006:#define BLYNK_PRINT Serial
007:#define BLYNK_USE_DIRECT_CONNECT
008:#include "BlynkSimpleEsp32_BLE.h"
009:#include "ESP32Servo.h" // Ver.0.90 https://www.arduinolibraries.info/libraries/esp32-servo
010:#include "Wire.h" // I2c 測距センサーに使用。
011:#define SENSOR_ADRS   0x40
012:#define DISTANCE_ADRS 0x5E
013://先の1号機より、サーボモーターを2個減らして12個+1個としました。
014:Servo servo1;
015:Servo servo2;
016:Servo servo3;
017:Servo servo4;
018:Servo servo5;
019:Servo servo6;
020:Servo servo7;
021:Servo servo8;
022:Servo servo9;
023:Servo servo10;
024:Servo servo11;
025:Servo servo12;
026:Servo servo_pan;
027://使用するピン番号も変更しています。
028:int servo1Pin = 13;
029:int servo2Pin = 12;
030:int servo3Pin = 14;
031:int servo4Pin = 27;
032:int servo5Pin = 26;
033:int servo6Pin = 25;
034:int servo7Pin = 33;
035:int servo8Pin = 15;
036:int servo9Pin = 2;
037:int servo10Pin = 4;
038:int servo11Pin = 16;
039:int servo12Pin = 17;
040:int servo_panPin = 32; // 測距センサー用サーボモータ
041:// 以下の2行はSG90サーボモータ用設定値。必要に応じて調整が可能です。
042:int minUs = 500;
043:int maxUs = 2400;
044:int counter = 0; // ループカウンタの変数
045:float lag = .5712; // セグメント間の位相遅れ
046:int frequency = 1; // セグメントの発振周波数。
047:int amplitude = 40; // 蛇行運動の振幅
048:int rightOffset = 6; // Right turn Offset 使用したサーボモーターの特性で左へ偏るので右側を5+1としています。
049:int leftOffset = -5; // Left turn Offset
050:int delayTime = 5; // Delay between limb movements
051:int startPause = 5000;  // ロボットを配置するための遅延時間
052:int Offset = 1; // 048行と同じ理由で直進せずに少し左寄りに進むため、右寄りに+1補正しています。
053:// 上のOffsetはサーボモータの偏りを補正しています。.
054:int ModeLED = 5; // Mode Indicator LED
055:int Mode = 0; // Mode initial value
056:int button2 = 0; // Forwardボタンの初期値
057:int button3 = 0; // TurnRightボタン初期値
058:int button4 = 0; // Backwardボタンの初期値
059:int button5 = 0; // TurnLeftボタンの初期値
060:int wallDistanceTolerance = 30; // 障害物感知距離の設定、ここでは30㎝に設定しています。
061:byte des[2] ;
062:uint8_t Front_distance = 0;
063:uint8_t Left_distance = 0;
064:uint8_t Right_distance = 0;
065:char auth[] = "********************"; // Blynkの設定時に取得したAuth Tokenを記入します。
066:
067:void setup() {
068:  Serial.begin(115200) ; // USB Serial
069:  Wire.begin() ; // I2c
070:  Serial.println("Waiting for connections...");
071:  Blynk.setDeviceName("WHITE SNAKE"); // 判りやすい任意の名前を付けます。
072:  Blynk.begin(auth);
073:  pinMode(ModeLED, OUTPUT); digitalWrite(ModeLED, HIGH); // Mode LED default settings.
074:  // Attach segments to Pins
075:  servo1.setPeriodHertz(50);
076:  servo2.setPeriodHertz(50);
077:  servo3.setPeriodHertz(50);
078:  servo4.setPeriodHertz(50);
079:  servo5.setPeriodHertz(50);
080:  servo6.setPeriodHertz(50);
081:  servo7.setPeriodHertz(50);
082:  servo8.setPeriodHertz(50);
083:  servo9.setPeriodHertz(50);
084:  servo10.setPeriodHertz(50);
085:  servo11.setPeriodHertz(50);
086:  servo12.setPeriodHertz(50);
087:  servo_pan.setPeriodHertz(50);
088:
089:  servo1.attach(servo1Pin, minUs, maxUs);
090:  servo2.attach(servo2Pin, minUs, maxUs);
091:  servo3.attach(servo3Pin, minUs, maxUs);
092:  servo4.attach(servo4Pin, minUs, maxUs);
093:  servo5.attach(servo5Pin, minUs, maxUs);
094:  servo6.attach(servo6Pin, minUs, maxUs);
095:  servo7.attach(servo7Pin, minUs, maxUs);
096:  servo8.attach(servo8Pin, minUs, maxUs);
097:  servo9.attach(servo9Pin, minUs, maxUs);
098:  servo10.attach(servo10Pin, minUs, maxUs);
099:  servo11.attach(servo11Pin, minUs, maxUs);
100:  servo12.attach(servo12Pin, minUs, maxUs);
101:  servo_pan.attach(servo_panPin, minUs, maxUs);
102:
103:  // 初期の姿勢になります。1モーションが終了すると元の姿勢で止まります。
104:  servo1.write(90 + Offset + amplitude * cos(5 * lag));
105:  servo2.write(90 + Offset + amplitude * cos(4 * lag));
106:  servo3.write(90 + Offset + amplitude * cos(3 * lag));
107:  servo4.write(90 + Offset + amplitude * cos(2 * lag));
108:  servo5.write(90 + Offset + amplitude * cos(1 * lag));
109  servo6.write(90 + Offset + amplitude * cos(0 * lag));
110:  servo7.write(90 + Offset + amplitude * cos(-1 * lag));
111:  servo8.write(90 + Offset + amplitude * cos(-2 * lag));
112:  servo9.write(90 + Offset + amplitude * cos(-3 * lag));
113:  servo10.write(90 + Offset + amplitude * cos(-4 * lag));
114:  servo11.write(90 + Offset + amplitude * cos(-5 * lag));
115:  servo12.write(90 + Offset + amplitude * cos(-6 * lag));
116:  servo_pan.write(90);
117:}
118:
119:BLYNK_WRITE(V0) { // 自動/手動 切り替えボタンの設定
120:  int button0 = param.asInt();
121:  if (button0 == 1)
122:  {
123:    Serial.print("Autonomous Mode\n");
124:    Mode = 1; // Autonomous Mode
125:    digitalWrite(ModeLED, LOW);
126:  } else {
127:    Serial.print("Manual Mode\n");
128:    Mode = 0; // Manual Mode
129:    digitalWrite(ModeLED, HIGH);
130: }
131:}
132:
133:BLYNK_WRITE(V1) { // キャリブレーションボタンの設定
134:  int button1 = param.asInt();
135:  if (button1 == 1)
136:  {
137:    Serial.print("Calibrate ON\n");
138:    Calibrate();
139:  } else {
140:    Serial.print("Calibrate OFF\n");
141:  }
142:}
143:
144:BLYNK_WRITE(V2) { // Forwardボタンの設定
145:  button2 = param.asInt();
146:}
147:
148:BLYNK_WRITE(V3) { // TurnRightボタンの設定
149:  button3 = param.asInt();
150:}
151:
152:BLYNK_WRITE(V4) { // Backwardボタンの設定
153:  button4 = param.asInt();
154:}
155:
156:BLYNK_WRITE(V5) { // TurnLeftボタンの設定
157:  button5 = param.asInt();
158:}
159:
160:void Forward() { // 前進
161:  for (counter = 0; counter < 360; counter += 1)  {
162:    delay(delayTime);
163:    servo1.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 5 * lag));
164:    servo2.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 4 * lag));
165:    servo3.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 3 * lag));
166:    servo4.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 2 * lag));
167:    servo5.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 1 * lag));
168:    servo6.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 0 * lag));
169:    servo7.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 1 * lag));
170:    servo8.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 2 * lag));
171:    servo9.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 3 * lag));
172:    servo10.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 4 * lag));
173:    servo11.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 5 * lag));
174:    servo12.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 6 * lag));
175:  }
176:}
177:
178:void Backward() { // 後退
179:  for (counter = 360; counter > 0; counter -= 1)  {
180:    delay(delayTime);
181:    servo1.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 5 * lag));
182:    servo2.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 4 * lag));
183:    servo3.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 3 * lag));
184:    servo4.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 2 * lag));
185:    servo5.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 1 * lag));
186:    servo6.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 + 0 * lag));
187:    servo7.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 1 * lag));
188:    servo8.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 2 * lag));
189:    servo9.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 3 * lag));
190:    servo10.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 4 * lag));
191:    servo11.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 5 * lag));
192:    servo12.write(90 + Offset + amplitude * cos(frequency * counter * 3.14159 / 180 - 6 * lag));
193:  }
194:}
195:
196:void Turnleft() { // 左旋回
197:  for (counter = 0; counter < 10; counter += 1)  {
198:    delay(delayTime);
199:    servo1.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 5 * lag));
200:    servo2.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 4 * lag));
201:    servo3.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 3 * lag));
202:    servo4.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 2 * lag));
203:    servo5.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 1 * lag));
204:    servo6.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 0 * lag));
205:    servo7.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 1 * lag));
206:    servo8.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 2 * lag));
207:    servo9.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 3 * lag));
208:    servo10.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 4 * lag));
209:    servo11.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 5 * lag));
210:    servo12.write(90 + Offset + .1 * counter * leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 6 * lag));
211:  }
212:  // Continue left turn
213:  for (counter = 11; counter < 350; counter += 1)  {
214:    delay(delayTime);
215:    servo1.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 5 * lag));
216:    servo2.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 4 * lag));
217:    servo3.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 3 * lag));
218:    servo4.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 2 * lag));
219:    servo5.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 1 * lag));
220:    servo6.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 0 * lag));
221:    servo7.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 1 * lag));
222:    servo8.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 2 * lag));
223:    servo9.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 3 * lag));
224:    servo10.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 4 * lag));
225:    servo11.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 5 * lag));
226:    servo12.write(90 + Offset + leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 6 * lag));
227:  }
228:  // Ramp down turn Offset
229:  for (counter = 350; counter < 360; counter += 1)  {
230:    delay(delayTime);
231:    servo1.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 5 * lag));
232:    servo2.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 4 * lag));
233:    servo3.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 3 * lag));
234:    servo4.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 2 * lag));
235:    servo5.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 1 * lag));
236:    servo6.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 0 * lag));
237:    servo7.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 1 * lag));
238:    servo8.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 2 * lag));
239:    servo9.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 3 * lag));
240:    servo10.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 4 * lag));
241:    servo11.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 5 * lag));
242:    servo12.write(90 + Offset + .1 * (360 - counter)*leftOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 6 * lag));
243:  }
244:}
245:
246:void Turnright() { // 右旋回
247:  for (counter = 0; counter < 10; counter += 1)  {
248:    delay(delayTime);
249:    servo1.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 5 * lag));
250:    servo2.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 4 * lag));
251:    servo3.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 3 * lag));
252:    servo4.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 2 * lag));
253:    servo5.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 1 * lag));
254:    servo6.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 0 * lag));
255:    servo7.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 1 * lag));
256:    servo8.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 2 * lag));
257:    servo9.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 3 * lag));
258:    servo10.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 4 * lag));
259:    servo11.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 5 * lag));
260:    servo12.write(90 + Offset + .1 * counter * rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 6 * lag));
261:  }
262:  // Continue right turn
263:  for (counter = 11; counter < 350; counter += 1)  {
264:    delay(delayTime);
265:    servo1.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 5 * lag));
266:    servo2.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 4 * lag));
267:    servo3.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 3 * lag));
268:    servo4.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 2 * lag));
269:    servo5.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 1 * lag));
270:    servo6.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 0 * lag));
271:    servo7.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 1 * lag));
272:    servo8.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 2 * lag));
273:    servo9.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 3 * lag));
274:    servo10.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 4 * lag));
275:    servo11.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 5 * lag));
276:    servo12.write(90 + Offset + rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 6 * lag));
277:  }
278:  // Ramp down turn Offset
279:  for (counter = 350; counter < 360; counter += 1)  {
280:    delay(delayTime);
281:    servo1.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 5 * lag));
282:    servo2.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 4 * lag));
283:    servo3.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 3 * lag));
284:    servo4.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 2 * lag));
285:    servo5.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 1 * lag));
286:    servo6.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 + 0 * lag));
287:    servo7.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 1 * lag));
288:    servo8.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 2 * lag));
289:    servo9.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 3 * lag));
290:    servo10.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 4 * lag));
291:    servo11.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 5 * lag));
292:    servo12.write(90 + Offset + .1 * (360 - counter)*rightOffset + amplitude * cos(frequency * counter * 3.14159 / 180 - 6 * lag));
293:  }
264:}
295:
296:void Calibrate() { // サーボモータの90度設定用
297:  servo1.write(90);
298:  servo2.write(90);
299:  servo3.write(90);
300:  servo4.write(90);
301:  servo5.write(90);
302:  servo6.write(90);
303:  servo7.write(90);
304:  servo8.write(90);
305:  servo9.write(90);
306:  servo10.write(90);
307:  servo11.write(90);
308:  servo12.write(90);
309:}
310:
311:void Autonomous_Mode() { // Autonomous mode IRセンサーによる自律行動を行います。
312:  servo_pan.write(170);
313:  Left_distance = 0;
314:  delay(500);
315:  Wire.beginTransmission(SENSOR_ADRS) ;
316:  Wire.write(DISTANCE_ADRS) ;
317:  Right_distance = Wire.endTransmission() ;
318:  if (Left_distance == 0) {
319:    Left_distance = Wire.requestFrom(SENSOR_ADRS, 2) ;
320:    des[0] = Wire.read()  ;
321:    des[1] = Wire.read()  ;
322:    Left_distance = ((des[0] * 16 + des[1]) / 16) / 4 ; // 左側の測距値
323:    Serial.print("Left_distance = ") ;
324:    Serial.print(Left_distance) ;
325:    Serial.println("cm") ;
326:  } else {
327:    Serial.print("ERROR NO.=") ;
328:  }
329:  delay(500);
330:  servo_pan.write(10);
331:  Right_distance = 0;
332:  delay(500);
333:  Wire.beginTransmission(SENSOR_ADRS) ;
334:  Wire.write(DISTANCE_ADRS) ;
335:  Right_distance = Wire.endTransmission() ;
336:  if (Right_distance == 0) {
337:    Right_distance = Wire.requestFrom(SENSOR_ADRS, 2) ;
338:    des[0] = Wire.read()  ;
339:    des[1] = Wire.read()  ;
340:    Right_distance = ((des[0] * 16 + des[1]) / 16) / 4 ; // 右側の測距値
341:    Serial.print("Right_distance = ") ;
342:    Serial.print(Right_distance) ;
343:    Serial.println("cm") ;
344:  } else {
345:    Serial.print("ERROR NO.=") ;
346:  }
347:  delay(500);
348:  servo_pan.write(90);
349:  if (Left_distance > Right_distance ) { // 左側測距値より右側測距値が小さい場合
350:    Backward(); // 1モーション後退
351:    delay(200) ;
352:    Turnleft(); // 1モーション左旋回
353    Serial.println("Turnleft");
354:  }
355:  else if (Left_distance <= Right_distance ) { // 左側測距値より右側測距値が大きい場合
356:    Backward();// 1モーション後退
357:    delay(200);
358:    Turnright(); // 1モーション右旋回
359:    Serial.println("Turnright");
360:  }
361:  else {
362:    Forward(); // 障害物が無い場合は前進
363:    Serial.println("Forward");
364:  }
365:  delay(100) ;
366:}
367:
368:void loop() { // メインループ
369:  Blynk.run(); 
370:  if (button2 == 1) {
371:    Serial.print("Forward\n");
372:    Forward();
373:  }
374:  if (button3 == 1) {
375:    Serial.print("Turnright\n");
376:    Turnright();
377:  }
378:  if (button4 == 1) {
379:    Serial.print("Backward\n");
380:    Backward();
381:  }
382:  if (button5 == 1) {
383:    Serial.print("Turnleft\n");
384:    Turnleft();
385:  }
386:
387:  if (Mode == 1) { // Autonomous Mode 自律行動ON 
388:    Forward(); 
389:    servo_pan.write(90);
390:    delay(200);
391:    // Read basic measurement
392:    Wire.beginTransmission(SENSOR_ADRS) ;
393:    Wire.write(DISTANCE_ADRS) ;
394:    Front_distance = Wire.endTransmission() ;
395:    if (Front_distance == 0) {
396:      Front_distance = Wire.requestFrom(SENSOR_ADRS, 2) ;
397:      des[0] = Wire.read()  ;
398:      des[1] = Wire.read()  ;
399:      Front_distance = ((des[0] * 16 + des[1]) / 16) / 4 ; \\ 前方の測距値
400:      Serial.print("Front_distance = ") ;
401:      Serial.print(Front_distance) ;
402:      Serial.println("cm") ;
403:    } else {
404:      Serial.print("ERROR NO.=") ;
405:    }
406:    delay(100);
407:    if (Front_distance < wallDistanceTolerance) { // 30センチ以内に障害物が有れば自律モードに移ります。
408:      Autonomous_Mode();
409:    }
410:  }
411:}

最後までご覧頂きまして有難うございます。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!


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

Snake Robot No.2 White Snake その2

Blynk_logo_diamond.png
Blynk APPをスマートフォンにインストールしてSnake Robotをコントロール
WhiteSnake4.jpg

スネークロボットのコントロールに必要なBLEに対応したAPPがなく、Blynkを使って簡単なコントローラを作りました。
Blynkを使うもう一つの理由は、AndroidiPhoneの両方がサポートされているからです。
先ずは、Android版はGoogle PlayにてBlynkを、iPhone版はAPP StoreにてBlynk - IoT for Arduino, ESP32
夫々ダウンロードとインストールを行います。
Android版とiPhone版ではON/OFFスイッチの位置が逆など画面の構成や操作方法に僅かなが異なりますが、
ここではAndroid版を使った説明を行います。

Blynk APPの設定方法
1.
Blynkをインストールしたら
最初にアカウントを作成します。
Facebook accountでログイン又
は新規アカウンを作成します。
更にBlynkアカウントをお持ち



2.
新規作成の場合、
e-mailとパスワードを
入力します。





3.
サインアップすると
Create New Projectが開きます。
プロジェクト名を入力
SNAKE ROBOT BLE
デバイス名
ESP32 Dev Boardを選択
コネクションタイプ
BLEを選択してCreateをタップ
Screenshot_Blynk_01.jpgScreenshot_Blynk_02.jpgScreenshot_Blynk_03.jpg
4. 
OKをタップすと登録した
メールアドレスにAuth Tokenが
送られてきます。
このTokenをソースファイルに
書き込むので大切にします。



5.
作成初期画面
六角形アイコンがNew Project
Create New Projecを開く
丸+アイコンがWidget Boxの
部品選択画面です。
三角形アイコンが完成画面を
開きます。
6.
Widget Box
ここで使用部品を選びます。
各部品に点数を表示していて
2000点迄は無料。
ここで1番上のButton200点を
6個選択します。合計1200点
なので無料で使えます。
Screenshot_Blynk_04.jpgScreenshot_Blynk_05.jpgScreenshot_Blynk_06.jpg
7. 選択した6個のButton
後で各Buttonを長押しと
スライドして配置換えします。


8. 次にWidget Boxを下げて
BLEアイコンを選択します。



9. 各ButtonとBLEアイコンを
長押しとスライドして
この画面のように配置を
換えます。
Screenshot_Blynk_07.jpgScreenshot_Blynk_08.jpgScreenshot_Blynk_09.jpg
10.
コントロールボタンの設定
左上Buttonをタップすると
ボタン設定画面①が開きます。
ボタン名にcontrolと入力
下側のOUTPUTをタップすると
次の設定面②が開きます。




11.
設定画面②
ここでVirtualとV0を選択して
Select PinをOKします。







12.
新しく開いた画面では
PinがV0に替わっています。
次に下側のMODEをPUSHから
SWITCH(トグル)に切り替えて
下側のOFFをManual>に
ONをAUTO>に書き換えます。
下側のFont Sizeを大きくします。
注意:iPhonではON/OFFが逆
でFont Sizeが固定です。
Screenshot_Blynk_10.jpgScreenshot_Blynk_11.jpgScreenshot_Blynk_12.jpg
13.
今度は右側のCALボタンを
設定します。
使ったV0にはUSEDとマーク
されています。
今度はV1を選択して
Select PinをOKします。
14.
V1の設定画面では
ボタン名称を90 angleとし、
SWITCH(トグル)を使用。
その他は画像を参考にします。
変更します。


15.
V2 Forwardボタンの設定
画像を参考にして各項目を
設定します。
PUSHスイッチを使います。
その他は画像を参考にします。


Screenshot_Blynk_13.jpgScreenshot_Blynk_14.jpgScreenshot_Blynk_15.jpg
16.
V3 Right Turnボタンの設定
画像を参考にして各項目を
設定します。
PUSHスイッチを使います。
その他は画像を参考にします。
17.
V4 Backwardボタンの設定
画像を参考にして各項目をL
設定します。
PUSHスイッチを使います。
その他は画像を参考にします。
18.
V5 Left Turnボタンの設定
画像を参考にして各項目をL
設定します。
PUSHスイッチを使います。
その他は画像を参考にします。
Screenshot_Blynk_16.jpgScreenshot_Blynk_17.jpgScreenshot_Blynk_18.jpg
19.
V1からV6のの設定完了後
画面がこのようになります。


右端の三角形アイコンをタップ
すると完成画面に替わります。




20.
完成画面では各ボタンが
OFF状態の名称を表示します。
ボタン色がON状態で反転表示
Controlと90angleボタンは
トグルスイッチで、タップ毎に
色が反転します。
デバイスに接続していない時は
アイコンに赤マークを表示。
21.
BLEのコネクト方法
Snake Robotの電源を入れ、
Connect BLE deviceをタップ
すると次の画面に替わります。





Screenshot_Blynk_19.jpgScreenshot_Blynk_20.jpgScreenshot_Blynk_21.jpg
22.
Select BLE device画面
スキャンが実行され、コネクト
可能なデバイス名が表示
されます。
その中のBlynk選んでOKを
タップします。
23.
コネクト完了画面
コネクトするとデバイスの
アイコンに付いていた赤マーク
が消えます。
画像はControlボタンがONの
状態で表示色が反転中です。
24.
Project Settings画面にて
ショートカットアイコンが
作れます。
以上にてオリジナルBlynk
コントローラが完成です。


Screenshot_Blynk_22.jpgScreenshot_Blynk_23.jpgScreenshot_Blynk_24.jpg


次回はBlynkを使ったソースファイルを掲載予定です。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!


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

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

White Snake

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


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

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Snake Robot 蛇型ロボット その4

その4:コントロールボードの製作 2021年2月26日
各画像はクリックすると拡大します。

WiFiとBluetoothが搭載されたESP32チップを裏返し、両面テープでユニバーサル基板に貼り付けて手配線した
簡単なコントロールボードですが、これで複雑な蛇の蛇行運動を実現します。
右端のスイッチは、蛇行運動用サーボモータの出力を90度にセットするために設けました。90度に揃っていないと
左右どちらかへ弓なり、蛇が直進しません。その場合は一直線に揃うように補正値を修正する必要が有ります。
補正の詳細はソフト編で述べます。
SnakeRobot_esp32.jpg

参考にさせて頂いた元記事では、13個のサーボモーターをコントロールするために必要なPWM on GPIOを14個備えた
Arduino ATmega2560を使っていました。 しかし、その大きさと別途無線モジュールが必要なことなどが理由で小型で
安価なESP32を使うことにしました。 ここでは無線コントロールにBLE(Bluetooth Low Energy)を使用します。
尚、ESP32の場合PWMが使用可能なGPIOが18個搭載されていますが、、ここでは15個のGPIOを使用しています。
補足:最近ではATmega2560のミニタイプATmega2560 pro MINIが販売されていますがまだまだ高価です。
また、当初はPCA9685 16channel PWM Driverを使う計画でしたが、このドライバーボードが結構大きいので諦めました。
SnakeRobot_11.jpg

コントロールボードの回路図
下の回路図のようにESP32チップを裏返しに張り付けてあるので各GPIO名が判りやすく、インターフェースピンへの
手配線も間違わずに出来ると思います。 但し、ピンピッチが狭いので先の細い半田ごてが必要です。
プログラムの書き込み部はUSBシリアルモジュールを使った外付け回路としました。
ControlBoard_1.gif

部品配置図
私の例ですが参考にして下さい。手配線が嫌な方は、DOIT ESP32 DevKit V1等に置き換えて使うことが可能です。
クリックすると拡大します。
ControlBoard1A.gif

サーボモータへの配線方法について
各配線は本体中央部にまとめること、サーボモータの角度が90度の場合に配線距離が一番長く、0度又は180度側に
振ると外側へたわみます。そのため。配線をきつく束ねるとこの動きが重くなるので注意が必要です。
①蛇行運動用サーボモータへの配線は、コントロールボードのピンヘッダーからPWM信号線とGNDを配線します。
②+VとGNDの電源線は、最後尾のバッテリーから容量のある配線を用いて先頭のサーボモータまで配線します。
③各サーボモータの取り付けパネル上部にユニバーサル基板を加工した分岐基板をビス止めします。
④次に各々のサーボモータ近くで柔らかい配線を使って分岐して分岐基板へ配線します。ここでPWM信号線と一緒に
モーターリードと接続します。
⑤各配線を分岐基板へ直接半田付けすると、配線の先端が疲労切断する恐れがあるので、下記画像のように
ユニバーサル基板の穴を配線が通るように拡大し、一度その穴に通してから基板裏側で半田付けすると改善できます。
SnakeRobot_10.jpg

先頭(コントロール部)
測距センサー用サーボモータの電源はコントロール用電源を使用。DC/DCコンバータ(MT3608)はリポバッテリーの
裏側に取り付けています。
SnakeRobot_Control.jpg

最後尾(バッテリー部)
蛇行運動用サーボモータの電源部で単4型充電池4個を搭載しています。
SnakeRobot_battery.jpg

最後に動画をご覧下さい。



次回はその5 リモコン部を掲載の予定です。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Snake Robot 蛇型ロボット その3

その3:ボディーの製作 2020年2月17日

このSnakeRobotの原型は2017年4月にjoesinstructablesがinsutructables circuitsに発表された作品を参考に
安価で入手が容易な小型サーボモータを15個使い、コントロールボードを小型化した作品です。
興味のある方は、次のURを参考にして下さい。https://www.instructables.com/Snake-Robot-1/SnakeRobot
参考:組み立てキットや完成品も販売されていますが、US$683~746と大変高価です。
https://nevemtech.com/Paymentfinal.aspx?id=N459&stat=h&cnt=Japan

タイトルに100ドル以下で作ると書きましたが、新規購入費用は半分の5000円ほどで済みました。
手前はBluetooth(BLE)を使った自作コントローラーです。
SnakeRobot_Top.jpg

主な部品リスト(制御部のパーツを含む)
サーボモータは到着までに20日ほど掛かりますが、AliExpressが断然安かった!送料込みで1個 100円余し!
部品名型番又は商品名個数参考
アクリル板2㎜、3㎜、5㎜100X300 端材数枚 手持ち品
強力両面テープスコッチ 超強力両面テープ1個ヨドバシカメラ
タイヤ用Oリング1A-P9 [Oリング(10個入り)]32個(4 set)ヨドバシ 1set  248円
サーボモータSG9015個AliExpress 1個 1US$
マイコンモジュールESP32 WROOM 32D1個秋月電子 1個 460円
測距モジュールGP2Y0E02 I2C&analog1個秋月電子 1個 680円
ユニバーサル基板片面ガラス基板 Cタイプ3枚秋月電子 1枚 60円
ピンヘッダー1x40(40P)1個秋月電子 1個 35円
分割ピンソケット1x42(42P)1個秋月電子 1個 80円
電池ケース単4 2個タイプ2個秋月電子 1個 50円
その他配線材・ビス類多少手持ち品


1)ボディー部の製作
SG90型サーボモータを組み込む為のパーツをCNC加工して作ります。

使用する材料はアクリル板は、厚さ2㎜、3㎜、5㎜の3種類で、下図が各パーツと組み立て略図です。
私はサーボモータを14個使ったので同じパーツを14組作り、それを超強力両面テープを使って連結しました。
下図の斜線部分が超強力両面テープでサーボモータを固定した部分です。図はクリックすると大きく見れます。
SnakeRobot_parts.gif

1ユニットの組み立て
下の画像は加工した1ユニット分のパーツですが、サーボモータを挟み込むプレートが抜けていました。
左側のパーツを組み立てると右側のように1ユニットが出来上がります。
サーボモータが届く前に設計図を作ったら、以前日本で購入した物と細部が違い一部変更が必要でした。
SnakeRobot_06.jpg

このように連結して組み立てます。
サーボモーターに貼ってある数字のラベルは、各モーターに90度信号入力テスト時の補正値です。
SnakeRobot_07.jpg

先頭部(ESP32を使って小さくまとめたコントロール部)
先頭のサーボモータはIR測距センサーを左右に振るためのモータです。測距センサーGP2Y0E02はI2Cにて接続。
私はユニバーサル基板にESP32モジュールを組み込んで使いましたが、ESP32 Devkitでも使えます。
コントロール部は別電源とし、3.7V500mAhのリポバッテリーをDC/DCコンバータで5Vに昇圧しています。
SnakeRobot_08.jpg

最後部(電源部)
サーボモータ14台分の電源を賄うバッテリーに単4充電池1.2Vを4個使用してます。
14個のサーボモータを1度に動かすのでモーター電源の供給は、バッテリーから末端まで太い配線を使い、
夫々のモータの近くで分岐して供給する方法を採用、端末のモータも電圧降下が少なく元気に動きます。
SnakeRobot_09.jpg

最後に動画をご覧下さい。



次回はその4 制御部を掲載の予定です。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Snake Robot 蛇型ロボット その2

動画が出来ましたので先に掲載します。

その1でも述べましたが、この蛇型ロボットには車輪が付いていますが、全てフリーホイールです。
動く原理は、実際の蛇と同様にくねくねと蛇行する運動によって進みます。
この蛇行運動は、14個のサーボモータをコントロールするマイコンにより実現しています。



次回から製作編、ソフト編を順次掲載の予定です。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Snake Robot 蛇型ロボット その1

Snake Robot 蛇型ロボット その1 2021年2月8日
先にお知らせしていました蛇型ロボットが出来上がりました。
今回も自作のCNCマシンを使い、アクリル板を切削して各パーツを作りました。

このSnakeRobotの原型は2017年にjoesinstructablesがinsutructables circuitsに発表された作品を
参考に、安価で入手が容易な小型サーボモーターや超小型のマイコンボードを自作して小さく纏めてみました。

興味のある方は、次のURを参考にして下さい。https://www.instructables.com/Snake-Robot-1/SnakeRobot
動作については動画を見て頂くのが1番ですが、未だ準備が出来ず、後日撮影の予定です。

完成したSnakeRobot本体 原形ではサーボ―モータを12個連結ですが、2個増やして14個としました。
また、距離センサーをコントロール部に直結する為に原形とは進行方向を逆向きしています。
SnakeRobot_01a.jpg

このSnakeRobotの特徴は、車輪で動くのではなく、実際の蛇と同様にくねくね運動によって進みます。
車輪は蛇の鱗の代わりに胴体方向には転がりますが、斜めや横方向にはグリップが掛かり、進行方向へ
押し出す力となります。

SnakeRobot_02.jpg

先頭部には自律歩行の為の赤外線距離センサーとコントロール部を配置しました。
コントロール部の電源には3.7V500mAhのリポバッテリーを使用。サーボモータのバッテリーは最後部に搭載。

SnakeRobot_03.jpg

原形ではコントロール部に大きなATmega2560を使ってますが、小さく作ることが目標なのでESP32チップを
ユニバーサル基板に組み込んで小さく作りました。 また、ESP32を使うことにより、WiFiやBluetoothが使え、
リモコンモジュールの追加が不要となります。

SnakeRobot_05.jpg


次回から製作編、ソフト編を順次掲載の予定です。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

お知らせ

現在、SG90小型サーボモータを複数個使った蛇型ロボを製作中です。
ESP32にサーボモータやIRセンサーをI2C接続し、特異な蛇の動きを再現します。
SG90の到着が遅れ、完成までに今しばらく時間が掛かりそうです。

sg90.jpg
by Paradise


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

低温度差スターリングエンジン 第2作品

上板(コールド面)をアルミ板からアクリル板に変更した作品の紹介
前作品と基本構造は同じですが、アクリル板に変更したことによりゴムパッキンを省略して上部の部品を
直接着としました。
2nd_01.jpg

前作品との相違部分
底板(ホット面)には前作同様に熱伝導率が優れたアルミ板を使いましたが、ディスプレーサ・シリンダー、上板、
、プール枠、フライホール支持タワー、パワーピストン・ベース、ディスプレーサ・ガイドは全て直接着としました。

立面図
StirlingEngine_No3.gif

比較画像:パワーピストン側
2nd_02.jpg


比較画像:ディスプレーサ側
2nd_03.jpg

パワーピストン側
2nd_04.jpg

ディスプレーサ側
2nd_05.jpg

動画をご覧下さい。
コーヒーカップを保温マグカップに替えれば1杯の熱湯で3時間ほど回転します。



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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : 工作の作品
ジャンル : 写真

A happy new year

A happy new year
謹賀新年
本年もよろしくお願い致します。
2021nenga2.jpg

hr size="1" />

良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

低温度差スターリングエンジン 組み立て編

その3 部品の組み立て    2020年12月21日   前回の製作編と併せてご覧下さい。

末尾に新しい動画を掲載しましたのでご覧下さい。
StirlingEngine_03.jpg

1)ディスプレ―サ・シリンダーの組み立て
:私は手持ち材料の関係で厚さ5㎜の透明アクリル板を使いましたが、厚さ20㎜が有れば1枚でOKです。
①厚さ5㎜のリング4枚を重ねて接着し、高さ20㎜のシリンダーを作りますが、一度に4枚を接着せずに2枚ずつ接着
します。 先ず、ズレを防ぐために太さ1.6㎜の真っ直ぐな針金を用意してリングに空けた1.6㎜の穴対角4ヶ所に通し
ます。 また、上側リングの内側下部を少し45度に面取りすると接着液が垂れずに接着面に浸透します。
2枚重ねが二組出来たら、次にこの二組を接着します。アクリル接着液の流し込みには注射器を使うのが便利です。

②シリンダーの接着が終わったら、シリンダーの上側の下穴1.6㎜にM2のタップ(深さ約8㎜)を切ります。
無理にタップを切るとひび割れの恐れがあるので、丁寧にゆっくりと12ヶ所を加工します。
但し、コールド面に冷却水用のプールを設けない場合は、タップを切る必要が無く直接2X6タップタイトにて接合します。

StirlingEngine_00l.gif

2)冷却水用プール枠の組み立て
コールド面冷却水用プール枠のリングもディスプレ―サ・シリンダー同様に接着します。

3)パワーシリンダーの組み立て
先ず、パワーシリンダーベースの上下部品を接着します。次にパワーシリンダーのガラス管下部に
接着剤(セメダインスーパーXクリア)を塗布して深さ3㎜の底部まで垂直に押し込みます。

4)ディスプレ―サガイドの組み立て
①先ず、ディスプレ―サガイドの上下を接着しますが、2.0㎜の穴に2㎜径の真鍮丸棒を差し込み、抵抗が無く
軽く動くことを確認、もし固いようであれば穴を少し広げます。そして丸棒に通した状態で上下を接着します。

②次に製作編で記したようにシールド部から空気の漏れが無い程度に軽く密着しているかを確認した後に
真鍮丸棒を通した状態で下部と接着します。 また、ディスプレ―サシャフトにはグリスを塗布してから挿入します。

5)フライホイール・タワーの組み立て
フライホイール・タワーの前後2枚のパネルを接着しますが、先ず、ベアリングホルダーにベアリングをはめ込み、
5㎜径真鍮シャフトを差し込み、センターにズレが無く軽く回る状態で接着します。

6)上板(コールド面)アルミ板への取り付け
StirlingEngine_04.jpg

①ディスプレ―サガイドをアルミ板の中央にゴムパッキンを介して置き、裏側から3本のタップタイト2X6にて
固定します。 この後、ディスプレ―サを下部から挿入して軽く動くことを確認しておきます。

②次にパワーシリンダーを同様に固定します。

③フライホイール・タワーを同様に固定します。

④ディスプレ―サ・シリンダーを取り付けますが、先ず、プール枠のリングに12本のM2x20ボールトを通し、
ゴムパッキンを介してアルミ板に差し込みます。 次に裏側からゴムパッキンを介してシリンダーを押し当て、
プール枠側からボールトを締め付けますが、偏らず対角に交互しながら少しずつ行います。

⑤ここまで出来たら、ディスプレ―サを挿入してからゴムパッキンを介して底板(ホット面)のアルミ板を
シリンダー下部に2X6タップタイト12本にて取り付けます。
このネジ頭がカップに載せた本体が落ちるのを止める役目をします。

7)フライホイールとパワーピスト、ディスプレ―サのセット
①フライホイールの取り付け
フライホイール・タワーのベアリングにシャフトを通してフライホイールを取り付けますが、ベアリングとフライホイールの
間に隙間を作らないと接触して回転が悪くなります。ここに0.7㎜のステンレス線をリング状に加工したスペーサーを
入れます。リングの作り方は、シャフトにステンレス線をコイル状に蜜巻きし、1周分をカットしたOリングを2個作ります。

②ディスプレ―サ・クランクの取り付け
フライホイールをシャフトに通したら回転させて振れが無いことを確認し、ディスプレ―サ・クランクを重ねて接着します。
接着剤が乾いたらM3セットスクリューでシャフトに固定します。

③ディスプレ―サ連接棒(Connecting rod:通称コンロット)の取り付けと調節
ディスプレ―サ・シャフト尖端の0.8㎜穴とディスプレ―サ・クランクに取り付けたM2ステンレスネジとを転結するロットを
0.7㎜ステンレス線を加工して作ります。先ず、ステンレス線を80㎜程に切断し、片方の先端に2㎜のループを作ります。
針金の加工には先丸ペンチが便利です。同様の品がダイソーの300均でも購入できます。 下の画像を参照
sakimaru.jpg

先に加工したステンレス線のループにM2X8ボールトを通し、ロック用ナットを入れてクランクのネジ穴にセットします。
次にクランクが一番下がった状態でディスプレ―サの位置が底板から2㎜上となる位置でディスプレ―サ・シャフト尖端の
穴に入る位置でステンレス線を90度折り曲げて挿入後、抜け止めに先端を少し曲げておきます。 下の画像を参照
Displacer_crank.jpg

④パワーピストン・コンロッドの取り付け
パワーシリンダーからピストンを取り出し、最初に付いていたコンロッドが短いのでを外してステンレス線と交換します。
外し方は、コンロッドを持って外側のグラファイト製スリーブを半分ほど押し下げると金属ピストンに挿入したピストンピンが
現れます。このピンを針金の先で押すとコンロッドが外れます。
ステンレス線の長さは80㎜程に切断してから作業を行います。
このピストンピンは直径が2㎜なので、直径0.7㎜のステンレス線を使って先端に内径2㎜のループを作ります。
出来たループを元のコンロッドと同じように金属ピストンに取り付け、グラファイト製スリーブを元に戻します。
次にシリンダーにピストンを挿入し、ピストン側クランクをフライホイールシャフトに挿入しますが、先に作ったOリングを
忘れずに嵌め込みます。
PowerPiston.jpg

⑤ピストンコンロットの長さ合わせ
ピストン側クランクが一番上側(上死点)の位置にある時、シリンダー上面の少し下側にピストンのスリーブが来るように
コンロッドの長さを調節します。 長さが決まれば、その位置にクランクピンのループを作り、先のディスプレ―サ側と
同様にM2X8のボールトナットで固定します。 下の画像を参照
PowerPistonCrank.jpg

8)クランク角度の調整
ここでは、フライホールの回転方向をディスプレーサ側から見て右回りに設定しているのでピストン側クランクピンの
位置より、ディスプレーサ側クランクピンの位置が90度回転方向に進んだ位置にセットしています。
位置が決まれば、両側クランクのセットスクリューを締めて動かないようにします。
もし反対方向に回す場合は、今の位置から180度位置を変えればOKです。

9)テスト運転
では、カップに熱湯を注いで本体を載せます。暫くして底板(ホット面)が温まると少し指でフライホイールを
動かすだけで回転を始めます。 お湯を使うのでやけどしないように注意して下さい。
お子様と一緒に動かす場合は、お湯ではなく貼るカイロなどを使って安全に配慮して下さい。
私の場合はステンレスの二重構造保温マグカップを使うと3時間程回転を続けます。
また、上板(コールド)側に冷蔵庫の氷を一片置くと、掌に載せて自分の体温との差で動かせることが出来ます。

最後に動画をご覧下さい。 12月24日修正版に更新しました。



最後までご覧いただきまして有難うございました。
次回は底面以外をアクリル板で作ったスターリングエンジンを紹介します。


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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : 工作の作品
ジャンル : 写真

低温度差スターリングエンジン 製作編

アクリル板とアルミ板をCNC加工して作る低温度差スターリングエンジン
その2 製作編 各パーツの製作
    2020年12月12日



主な部品リスト
品名サイズ数量 参考
透明アクリル板厚さ5㎜ 100X200㎜2枚アクリル屋ドットコム 端材
白色アクリル板厚さ5㎜ 100X200㎜3枚アクリル屋ドットコム 端材
アルミ板厚さ2㎜ 100X200㎜1枚ヨドバシ 光モール HA-2013 [アルミ板 2x100x300mm]
真鍮丸棒直径5㎜ 長さ27㎜1本ヨドバシ 光モール BM995-5 [真鍮丸棒 5×995mm]
真鍮丸棒直径2㎜ 約55㎜1本ヨドバシ 光モール BM995-2 [真鍮丸棒 2×995mm]
ゴムシート厚さ1㎜ 100X約400㎜ 1枚ヨドバシ 光モール KGR-1102 [ゴムロール巻 1×100mm×1m]
発泡スチレンボード厚さ5㎜ 100X100㎜1枚ダイソー カラーボード定尺
パワーピストン シリンダー径約15㎜1本AMAZON 2本660円
ステンレスビスM2X20㎜12本AMAZON (トラスコ) ナベ頭小ネジ B05-0220
鍋頭タップタイトP2X6㎜24本ヨドバシ 大里 532-661 1袋30本入り
ベアリング850ZZ2個ヨドバシ
ステンレス線0.7㎜径少々手持ち品

立面図 画像をクリックすると大きい画像が見れます。 注意:各図は実寸ではありません。
StirlingEngine_00l.gif

1)アルミ板の加工と配置図 
ディスプレ―サ・シリンダーの上板(コールド面)と底板(ホット面)に使う厚さ2㎜のアルミ板をCNCを使って加工しました。
al_base.gif

配置図:左側がディスプレ―サ・シリンダー、右側が上板(コールド面)で各部品をアルミ板裏側から
タップタイトネジを使ってゴムパッキンを介して取り付けます。
Parts_layout1.gif

2)ディスプレ―サ・シリンダーの加工
左側がディスプレ―サ・シリンダーで4枚作ります。右側がアルミ上板(コールド面)の冷却用プールの枠で2枚作ります。
ディスプレ―サ・シリンダーのネジ穴が1.6㎜、プール枠のネジ穴が2.0㎜です。
:手持ちのアクリル板が5㎜厚だったのでこのように設計しましたが、10㎜厚を使えば枚数を少なくできます。
Cylinder.gif

3)フライホイール・タワーの加工
切削したアクリル板を二枚背中合わせにして接着しますが、ベアリングをフォルダーにはめ込み、
シャフトを通した状態でズレが無いように接着液を注入します。
出来上がれば、脚部底面に取り付け用のネジ穴1.7㎜径、深さ6㎜の穴4ヶ所を垂直に開けます。
左右脚の穴間隔は27㎜です。片側に2か所で板厚のセンターです。
tower1.gif

4)フライホイールの加工
厚さ5㎜のアクリル板をCNCを使って加工します。
Flywheel1.gif

5)パワーシリンダーベース他小物類の加工
①パワーシリンダー用ベース
上板(コールド面)にネジ止めする下部とシリンダーが入る上部で構成します。上下はアクリル接着液にて接着。
シリンダーが入る部分は直径15.1㎜、深さ3㎜のポケット加工をしてあり、ガラスシリンダーの下部に接着剤を
塗布して奥まで押し込めばOKです。

②ディスプレーサのシャフトガイド
こちらも上板にネジ止めする下部とその上に接着する中部のセンターには2㎜径の穴があり、この中に外径2㎜の
ディスプレーサ・シャフトが通ります。接着時はシャフトを通してセンターがズレないように注意します。
その上部にシールド用の厚さ5㎜、外径12㎜、内径1.95㎜のシールド部を接着しますが、シャフトと隙間があると
ディスプレーサ内部の空気が漏れるので調整が必要です。
私は先端を尖らせた2㎜の真鍮丸棒にオイルを付け、ドリルで回転させながら押し込み馴染ませる事により隙間が
なく、滑らかに動くようにしました。

③パワーピストンとディスプレーサ用クランクの加工
連接棒(コンロット)の軸にM2ステンレスネジを使いました。このネジが入る下穴1.6㎜にM2タップを切ります。
クランクを5㎜シャフトに固定するための下穴2.5㎜を開け、M3タップを切りM3セットスクリューを挿入します。
PowerCylinderBase1c.gif

6)ディスプレーサの加工
①ディスプレーサの材料は百均で購入できるスチレンボード(ダイソーでは商品名カラーボード)厚さ5㎜を用意します。
これを外径80㎜の円盤状にカットしますが、作業がし易いように100X100㎜の大きさにカットします。
正確にカットするには、オルファのコンパスカッターを使うと綺麗に切り抜けます。
また、切り取った後の角を紙やすりで丸く削り、空気の流れがスムーズになるよう滑らかに仕上げます。
OLFA.jpg

②この時にスチレンボードに直接コンパスの針を刺すと穴が大きく変形するので、スチレンボード表裏のセンターに
両面テープを張り付けます。両面テープの剥離テープはかなり強度があるので穴が拡大しません。
もう一点注意する事は、正確に垂直を出す必要があるのでボール盤で0.8㎜程度の下穴を貫通しておきます。
コンパスカッターは表裏両面からカットすると綺麗に切り取れます。

7)ディスプレーサ・シャフトの加工と取り付け
①先ず、直径2㎜の真鍮丸棒を長さ55㎜に切断し、シャフトの上端から3㎜の位置に0.8㎜のドリルで穴を貫通します。
2㎜の真鍮丸棒に0.8㎜の穴を開けるのは難しいと思いますが、ビットが滑らないように少しやすりで平にしてから
ピンバイスを使って行えば、正確に貫通出来ます。
Displacer1.jpg
②スチレンボードに直接2㎜の真鍮丸棒を接着するだけでは強度が足りないので、厚さ0.06㎜の銅箔を直径30㎜の
円盤状にカットしてシャフト下端から5㎜の位置にはめ込み、半田付けしてからスチレンボードに面接着しています。
スチレンボードに使う接着剤は、スチレンが溶解しないセメダインスーパーXクリアを使いました。

8)ゴムパッキンの加工
厚さ1㎜幅100㎜の1mロールを使ってシリンダーやピストンベースなどのパッキンを加工します。
①シリンダー用パッキンは予めロールから100X100㎜にカットします。先に加工した接着前のプール枠リングを
ゴムシートの上に置き、動かないようにして千枚通しなどを使ってネジ穴12ヶ所に下穴を開けます。
次に2㎜の皮ポンチを使って穴を開けますが、ずれが無いように下穴より少し細いピン10㎜を差し込み、
そのピンにポンチを差し込んで回転させると正確に2㎜径の穴が開きます。

②ゴムシートの内側の切断はシリンダーリングをネジ穴と合わせ、鉛筆で型ぞってからハサミで切っても良いが
リングを押さえながら直接カッターナイフで切ってもOKです。ゴムシートの外側は組み上がってからカッターナイフで
外側から切り取ると綺麗に仕上がります。 このパッキンを3枚作ります。

③パワーピストン・ベース、ディスプレーサ・ガイド、フライホイール・タワー脚部のパッキン加工
先に作ったシリンダーパッキンの内側端材を使い、現物に合わせて切り抜きます。

9)パワーピストン
試作ではパワーシリンダーとパワーピストンをアルミパイプを加工して作り一応動いたのですが、少し滑らかさに
欠けるため、代替品を探したらガラスシリンダーとグラファイピストンを使ったキットがアマゾンで販売されてるのを
見付けて購入しました。
下が購入したパワーピストンのキットです。販売業者によっては価格がまちまちですが、私が買ったのは
2個セットで660円、中国から約2週間で届きました。
このパワーシリンダーを前述5)の①パワーシリンダー用ベースに接着して使います。
連接棒(コンロット)が金属プレス製だったので、長さが調節出来る0.7㎜のステンレス線に置き換えて使用。
ガラスシリンダー外径15㎜、長さ30㎜
PowerPiston.jpg


次回はその3 製作編 組み立てを掲載します。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : 工作の作品
ジャンル : 写真

低温度差スターリングエンジンの製作

アクリル板とアルミ板をCNC加工して作るスターリングエンジン その1
2020年12月5日
スターリングエンジンは1816年にロバート・スターリングにより実用化された歴史のあるエンジンです。
StirlingEngine_00l.gif


このスターリングエンジンの概要
コーヒーカップに注いだお湯を熱源にフライホイールが回転する低温度差スターリングエンジンです。
ここでは、コーヒーカップを使いましたが、ステンレスの保温マグカップならお湯が冷めにくく長く動きます。
子供と遊ぶには、お湯が危険なので「ほっかほかカイロ」でも動きます。
また、上部の受け皿に氷を置くと更に上下の温度差が広がり回転数が増します。
下部の半透明シリンダー内にはスチレンボードを加工したディスプレ―サ(赤い円盤)が入っていますが、
シリンダーとの間に2㎜ほどの隙間を設けています。
このディスプレ―サはフライホイールに付けたクランクと連結して上下します。
反対側のクランクにはパワーピストンが連結していてディスプレ―サのクランクより90度遅れに設定しています。

動作原理については、私が説明するよりも名大のホームページに詳しく説明されていますので参考にして下さい。
「名大、低温度差スターリングエンジンの回転メカニズムを解明――わずかな温度差を回転運動として利用「」を開く

動画をご覧下さい。


次回から製作記事を掲載します。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : 工作の作品
ジャンル : 写真

Tensegrity Table (テンセグリティ テーブル)を作る その2

テンセグリティ テーブル ネオジウム磁石タイプの製作 (2020年11月1日)

ネオジウム磁石タイプ
右側が普通のタイプですが、アームのテンションワイヤーをネオジウム磁石に置き換えたのが左側です。
ネオジウム磁石の強力な磁力を応用したものです。 直径12㎜厚さ3㎜のネオジウム磁石3枚重ねを2組使用。
Tensegrity-Table_MW2

真横から見た所
特長は、テーブルとスタンド側のアームが無接触ですが、ネオジウム磁石の強力な磁力により引き合ってテンションが
掛かります。 ここでは、テーブルとスタンドを連結する糸(間隔75㎜、ナイロン製テグスを2本撚り)を3ヶ所にしました。
Tensegrity-Table_MG1.jpg

テーブルに負荷を掛ける
前回と同様にハンドクリームの瓶を載せました。これくらいの負荷ではビクともしませんが、負荷が重すぎるとテーブルが
落ちてしまいます。 ネオジウム磁石の枚数を増やせば耐加重が増します。
Tensegrity-Table_MG2.jpg

テーブルとスタンドの製作略図
テーブルとスタンドは厚さ3㎜のアクリル板をCNC加工しました。 四角い穴は5㎜厚のアクリル板が入るほど穴です。
製作略図は実寸ではありません。切削用データーが必要な方はDXFファイルをダウンロードして下さい。
切削用各DXFファイルをZIPファイルにてダウンロードできます。
TT3_table.gif

アームの製作略図
アームは厚さ5㎜のアクリル板を使用し、磁石の入る受け皿を深さ3.5㎜のポケット加工を施しています。
ネオジウム磁石は直径12㎜厚さ3㎜の穴開きネオジウム磁石を3枚重ね、瞬間接着剤で張り合わせた後、
受け皿にネジ止めしています。 アームと磁石の受け皿は差し込んだ後アクリル接着剤で固定します。
切削用DXFファイルは、テーブルとスタンドのZipファイルに同梱しています。
TT3_arm.gif


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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : 工作の作品
ジャンル : 写真

Tensegrity Table (テンセグリティ テーブル)を作る その1

テンセグリティ テーブル(2020年10月24日)
数日前、野鳥観察仲間から貴方の工作コレクションには、テンセグリティ構造を用いた作品は見当たりませんね!と
尋ねられました。 良いヒントを頂いたのでTensegrityとは何かを調べました。
テンセグリティ(tensegrity)とは、バックミンスター・フラーにより提唱された概念で、Tension(張力)とIntegrity(統合)を
合わせた造語だそうです。

早速、TensegrityをWebを調べたら、棒とロープを使ったオブジェやテーブルなど多くの作品が検索されました。
私が興味を持ったのが構造が簡単なテーブルで、早速アクリル板をCNC加工してオリジナルを作ってみました。

最初に作ったのが下の作品です。
右側の作品は、上から見ても構造が判るように透明アクリル板を使いました。
テーブルとスタンドの外周4ヶ所に同じ長さの糸(ここではテグスを使用)で連結し、テーブルとスタンドに接着固定した
アームの先端同士を糸で引っ張り合う(テンションを掛ける)だけですが、テーブルに物を置いても大丈夫な強度が有ります。
Tensegrity-Table_WW1.jpg

真横から見た所
これは基本模型ですが、木材とロープを使えば大きなテーブルも可能です。
Tensegrity-Table_Wire1.jpg

テーブルの上にハンドクリームの瓶を置いてみました。
細い糸を引っ張り合ってテーブルを浮かした状態にも関わらず、結構安定を保ちました。
Tensegrity-Table_Wire2.jpg

製作略図 興味のある方は作ってみてください。
厚さ3㎜のアクリル板をCNC加工して作りました。
テーブルとスタンドの直径は80㎜、上下の間隔は75㎜、糸にナイロンテグス4号太さ0.333㎜を使用。
私はテグスを使いましたが、結束が難しいので普通の糸でも充分です。
下の図は実寸ではありません。切削用データーが必要な方はDXFファイルをダウンロードして下さい。
切削用各DXFファイルをZIPファイルにてダウンロードできます。
Tensegrity_Table1.gif


次回はテンションワイヤーに置き換えてマグネットを使う方法を紹介します。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : 工作の作品
ジャンル : 写真

お絵描きロボット(OSTR)にOLED_SSD1306を追加

先に紹介しましたお絵描きロボット(OSTR)に小さなOLED表示器を取り付け、実行中のプロセスが
確認できるようにしました。 前回までの記事と併せてご覧下さい。

OLED SSD1306 128X64を追加
スマートフォンアプリWiFi TCP/UDP Controllerの16実行ボタンに対応して表示が変わります。
待機中はSelect 16 Buttonと表示します。
OSTR_SSD1306_1.jpg

スマートフォンアプリWiFi TCP/UDP Controllerの操作画面
操作画面右側16個の何れかのボタンを選択すると、そのボタンに対応した文字列を表示します。
WiFi_UDP_Controller3.jpg

実行中のプロセス名を表示
APP操作画面の3 DIAを実行中の例で、プロセスが終わるまで3 Diamond wait a bitと表示し、終了後に待機します。
Fontを小さく設定すれば情報量が増えますが、私(後期高齢者)は老眼なので見易いように大きくしています。
OSTR_SSD1306_2.jpg

OLEDの接続について
ここで使用したOLEDは0.96インチ128X64表示 SSD1306のI2Cインターフェースです。
ESP32のGPIO21(SDA)、GPIO22(SCL)及びVcc(3.3V)とGNDを接続します。
OSTR_SSD1306_3.jpg

SSD1306ライブラリーについて
ここではESP8266 and ESP32 OLED driver for SSD1306 displaysを使いました。
ここをクリックするとダウンロードページが開きます。

OLED対応ファームウェアを添付します。
今回は、フォントファイルを一体にしたので行数が長くなりますが、Arduino IDEにコピーして使います。
OSTR OLED Paradise Model


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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Open Source Turtle Robot (OSTR) その7(最終回)

図形の描き方

対角五角星の描画を例に説明します。
左図は外角旋回の一筆書きにて描く方法、右図は内角旋回のスイッチバックにて描く方法です。
pentagram.gif

1)一筆書きによる描画
スタート位置から図形の頂点まで移動し、ペンを下げて5角形の対角を前進で結びます。
頂点に戻ったらペンを上げてトップ位置に移動して停止します。

①図形データの記述方法1 図左側参照 この動作を単純に記述すると次のようになります。
forward(30); // スタート位置から30㎜前進
right(72); // 72度右旋回 72度=90度-頂点の内角36度の1/2
pendown(); // ペンを下げる
forward(60); // 60㎜前進
right(144); // 144度右旋回
forward(60); // 60㎜前進
right(144); // 144度右旋回
forward(60); // 60㎜前進
right(144); // 144度右旋回
forward(60); // 60㎜前進
right(144); // 144度右旋回
forward(60); // 60㎜前進
penup(); // ペンを上げる
right(72); // 72度右旋回 
forward(35); // 35㎜前進
done(); // モータ OFF

②図形データの記述方法2 同じ動作を繰り返す場合はfor()文を使うと簡潔になります。
同じ動作を4回繰り返すので for (int x = 0; x < 4; x++)と短く記述できます。
forward(30); // スタート位置から30㎜前進
right(72); // 72度右旋回
pendown(); // ペンを下げる
for (int x = 0; x < 4; x++) {  // { }内を4回繰り返し
forward(60); // 60㎜前進
right(144); // 144度右旋回
}
forward(60); // 60㎜前進
penup(); // ペンを上げる
right(72); // 72度右旋回 
forward(35); // 35㎜前進
done(); // モータ OFF

2)内角旋回とスイッチバックによる描画
1)と同じ図形を描きますが、内角旋回とスイッチバック(前後進)することにり、描画時間が大幅に短縮できる
特徴があります。
図形データの記述方法3
forward(30); // スタート位置から30㎜前進
right(72); //72 度右旋回
pendown(); // ペンを下げる
forward(60); // 60㎜前進
left(36); // 36度左旋回
backward(60); // 60㎜後進
left(36); // 36度左旋回
forward(60); // 60㎜前進
left(36); // 36度左旋回
backward(60); // 60㎜後進
left(36); // 36度左旋回
forward(60); // 60㎜前進
penup(); // ペンを上げる
right(72); // 72度右旋回
forward(35); // 35㎜前進
done(); // モータ OFF

ファームウェアの対角七角星や他の図形を参考に、面白い図形を考案して下さい。



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



最後までご覧い頂き有難うございました。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Open Source Turtle Robot (OSTR) その6

文字を描く方法
OSTRの本体が完成したら文字を描く手順を1個のFontデータとしてファームウェアに保存します。
先ずは、フォントのデザインから始めます。私は、Excelの罫線を使ってデザインしました。

私がファームウェアに組み込んだオリジナル英数フォント
Character_Design1.gif

1)英数フォントのデザイン
①下図のようにExcelのワークシートを縦横1:1の方眼状にセットします。
②一文字の大きさを大文字が縦8マス横4マス、小文字が縦10マス横3マスと統一します。
③ロボットは右向きにスタートすることを原則とし、スタートポイントは赤マークです。
④ストップポイントは1マス空け、次の文字のスタートポイントに右向きに停止(青マーク)することを原則とします。
⑤斜め罫線と横罫線の接続は、必ず罫線の交点で行います。
Character_Design2.gif

2)文字を描く手順
ロボットの進め方は一筆書きが効率的で理想ですが、文字によっては不可能なので後進描画も駆使して効率的に行います。
先ず、一筆書きで描くU、少し複雑なA、前後進で描くWについてソースの記述方法を説明します。
アルファベットのUを描く手順
void fontdat_U() { // U
right(90); // 右に90度旋回
pendown(); // ペンを下げる
forward(fs * 7); // 7マス前進
left(45); // 左に45度旋回
forward(sqrt(2)*fs);
 //1マスの対角線の長さをsqrt(2)で求め、fsを掛けた長さを前進、fsの定義がint fs = 3の場合は1fs=3mm
left(45); // 左に45度旋回
forward(fs * 2); // 2マス前進
left(45); // 左に45度旋回
forward(sqrt(2)*fs);
left(45); // 左に45度旋回
forward(fs * 7); // 7マス前進
penup(); // ペンを上げる
right(90); // 右に90度旋回
forward(fs); // 1マス前進
done(); // ステッピングモーター解放:モータードライバーのENABLEをOFF
}

アルファベットのAを描く手順
void fontdat_A() { // A
forward(fs * 2); // 2マス前進
right(68.2); // 右に68.2度旋回 旋回角度は3)勾配計算式にて求めます。
pendown(); // ペンを下げる
forward(sqrt(pow(2, 2) + pow(5, 2))*fs); //2×5マスの対角線の長さを求めて前進
right(21.8); // 右に21.8度旋回
forward(fs * 3); // 3マス前進
penup(); // ペンを上げる
backward(fs * 2); // 2マス後進 
right(90); // 右に90度旋回
pendown(); // ペンを下げる
forward(fs * 4); // 4マス前進 
penup(); // ペンを上げる
right(90); // 右に90度旋回
backward(fs * 2); // 2マス後進 
pendown(); // ペンを下げる
forward(fs * 3); // 3マス前進 
right(21.8); // 右に21.8度旋回
forward(sqrt(pow(2, 2) + pow(5, 2))*fs); //2×5マスの対角線の長さを求めて前進
penup(); // ペンを上げる
right(68.2); // 右に68.2度旋回
forward(fs * 3); // 3マス前進 
done(); // ステッピングモーター解放:モータードライバーのENABLEをOFF
}

アルファベットのWを描く手順 //特長:前進の一筆書きりも旋回角度が狭く書き上りが早い。
void fontdat_W() { // W
left(97.13); // 左に97.13度旋回
pendown(); // ペンを下げる
backward(sqrt(1 + pow(8, 2))*fs); // 1×8マスの対角線の長さを求めて後進
right(16.59); // 右に16.59度旋回
forward(sqrt(1 + pow(6, 2))*fs); // 1×6マスの対角線の長さを求めて前進
left(18.92); // 左に18.92度旋回
backward(sqrt(1 + pow(6, 2))*fs); // 1×6マスの対角線の長さを求めて後進
right(16.59); // 右に16.59度旋回
forward(sqrt(1 + pow(8, 2))*fs); // 1×8マスの対角線の長さを求めて前進
penup(); // ペンを上げる
right(82.80);//-0.07 // 右に16.59度旋回
forward(fs); // 1マス前進 
done(); // ステッピングモーター解放:モータードライバーのENABLEをOFF
}
④ここでは、AとUとWの3文字のみを参考に説明しましたが、フォントデザインの目標文字を指でなぞりながら
 ファームウェアのvoid fontdat_目標文字 ();を読み取ると動作が理解できると思います。
 尚、OSTR本体のキャリブレーションを正確に調整していないと描画した文字がズレてしまいます。
 前記の例を参考に貴方のオリジナルを作成して下さい。

3)勾配角度計算式 四捨五入は小数点以第二位としました。
キャラクターデザインを行ったExcelのワークシートに勾配計算式を追加しておけば大変便利です。
計算式は簡単「=DEGREES(ATAN(C4/E4))」これだけです。
Excel_1.gif

使い易いプルダウンメニューのリスト式にすると便利です。
Excel_1B.gif


次回は、図形の作成方法を説明します。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Open Source Turtle Robot (OSTR) その5

OSTR Paradise Model
OSTR_No3_02.jpg



OSTR Paradise Model ファームウェアの説明
先に紹介しましたキャリブレーション用ファームウェアにおいてOSTRの校正が終われば、WiFi機能を追加して
スマートフォンから操作が出来るようにします。前回のその4と併せてご覧下さい。

1)WiFi機能の追加
#include "WiFi.h"
#include "WiFiUDP.h"

WiFiUDP UDP;
char recbuff[8];
IPAddress myIP(192, 168, 4, 1);
IPAddress HOSTIP (192, 168, 4, 2);
const char *ssid = "OSTR"; //任意の名前を付けます。
const char *password = "12345678"; //任意のパスワードを設定します。

void setup() { //setupに次の3行を追加します。
WiFi.softAP(ssid, password); // setting SSID and Password
WiFi.config(myIP, WiFi.gatewayIP(), WiFi.subnetMask()); // setting IP Address
UDP.begin(8000); // setting UDP port,port number is the same setting as the controller and the side.
}

void loop() { //これでスマートフォンのAPPをセットすればWIFI UDPにて接続できます。
if (UDP.parsePacket() > 0) {
UDP.read(recbuff, 8);
UDP.flush();
}
WiFi_receive();
}

2)スマートフォンにWiFi TCP/UDP Controller APPのインストール
WiFi_APP.jpg

Google Playから無料のAPPをインストールしてください。以前から使わせて頂き、重宝している優れものです。
残念ですがiPhone用が無いようです。
下の画像はOSTR用に設定した操作画面です。
WiFi_UDP_Controller3.jpg

3)WiFi TCP/UDP Controllerの設定手順
①操作画面右上のPREFERENCEをタップすると設定画面が開きます。上から順に説明します。
②CONTROLLERはA-Eの5つの操作画面が選べます。
TARGETの設定:IP or Domain NameにWiFi機能の追加で記したIPアドレス192.168.4.1を入力します。
Portの設定:同じくUDP begin(8000に合わせて8000を入力します。
TCP/UDPの設定:UDPのラジオボックスを選択します。
BUTTONの設定: NAME:button1から25までの使用するボタンに名前を設定します。
 ここでは、button1、button3、button5、button7、button9は使わないのでdefのままとします。
 それ以外のボタンに上記操作画面を参考に記入して下さい。但し、文字は1行しか入力できません。
 行を増やすとボタンの体裁が崩れてしまうので注意して下さい。また、小文字を入力しても大文字が表示されます。
Commandの設定:操作画面左側の十字ボタンの設定です。ボタンをタップした時に出るコマンドキャラクターを
 button2 = F、button4 = L、button6 = R、button8 = Bと記入します。 
STOP COMMANDを設定:button名はdefのままにしてbutton2 、button4 、button6、button8のみチェックボックスを
 ONにします。これでボタンから指を離した時に停止します。これを忘れると指を離しても動作を続けるので注意して下さい。
button10から25のボタン設定:これらのボタンは、図形や定型文描画の他にFontSizeの切り替えとペンの上下操作を
 割り当てています。4)のファームウェアに合わせてコマンドキャラクターを設定します。
Visibilityの設定:ボタンを表示/非表示用のチェックボックスです。十字ボタンの1,3,5,7,8を非表示とします。
Repeatableの設定:intervalsは変更せずにVisibilityと同じ設定にします。
OPTIONの設定:LANDSCAPEのラジオボックスを選択します。
Button Sizeの設定:次は一番下から3行目に飛んでボタンのサイズを変更します。
 button 1-9を120に変更、button 10-25を90に変更しましたが、使用するスマホの画面に合わせます。
以上でWiFi TCP/UDP Controller APPの設定は終了です。

4)ファームウェアとFont dataを公開します。
先ずは、下記の「OSTR_Paradise_Model」ファームウェアをご覧下さい。
スマートフォンアプリのボタン操作に一致した受信信号をSwich caseにより選択します。
OSTRの前進/後進/左右旋回の他、図形や文字を描きます。また、ペンの上下やフォントサイズの切り替えも行います。

私の現用ファームウェアです。未だ、改良の余地が有りますが参考に添付しました。
OSTR Paradise Modelのファームウェアを別画面で開きます。

Font Dataは、大文字小文字のアルファベットと数字だけですが、組み合わせて文字列を表示できます。
フォントデータが、長いので別ファイルとしましたがファームウェアの下部に張り付けて使います。
Font Dataを別画面で表示します。

5)OSTRにファームウェアのインストール手順
ここでは、Arduino IDEやESP32のボード設定が完了していることを前提に説明しています。
①コントロール基板のUSBシリアル端子にUSBシリアル・モジュールとUSBケーブルを接続します。
②OSTRの電源を入れてから書き込みスイッチをONにします。
③次にリセットボタンを押すと書き込み準備が完了します。
④次にArduino IDEのツールを開き、ボードマネージャーからESP32 Dev Moduleを選択します。
⑤シリアル・ポート番号が表示されたら、チェックを入れます。
⑥次にツールバーのチェックマークをクリックするとコンパイルが始まります。
⑦コンパイルが完了したら、右隣りの⇒をクリックすると書き込みが始まり、暫くすると終了します。
⑧書き込みが終了後、必ず書き込みスイッチをOFFにします。

6)スマートフォンアプリとOSTRのWiFi接続手順
①OSTRの電源を入れ、スマートフォンの設定ボタンをタップしてWiFiを開きます。
②3)の設定が済んでいる場合、利用可能なネットワークリストにOSTRが入っています。これをタップすると接続が完了します。
③次にスマートフォンアプリWiFi TCP/UDP Controllerを開くと操作が可能となります。
④試しに左側の十字ボタンをタップしてOSTRの操作を試します。十字ボタンは押している間同じ動作を続けます。
⑤次に右側16個のボタンから図形又は定型文の何れかを選んで実際に描画させます。
 一度選択すると、そのプロセスが終了するまで他のボタンを押しても無効です。
⑥ファームウェアの図形やフォントと定型文は、次回の作り方を参考に各自自由に作成して登録して下さい。

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



次回は、描画用フォントデータの作成方法を説明します。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Open Source Turtle Robot (OSTR) その4

ハードウェアが完成したらキャリブレーションを行います。
OSTR_No3_12.jpg

ESP32を使ったOSTR用ファームウェアの説明
先ずは、Arduinoを使ったOSTRのトライアルページを参考にして下さい。ここをクリックします。
ここにはArduino unoを使ったトライアル型OSTRのハードウエア及びファームウェアについて詳しく解説されています。
このページのステップ2:ファームウェアをフラッシュするの下段にてTIRL_Arduino_TEST.zipがダウンロードできます。
私は、このファームウェアを参考に動作方法を調べ、手持ちの部品に合わせてファームウェアを書き換えました。

基幹部品の相違点
部品名オリジナルモデルパラダイスモデル
ステッピングモータ1/16 or 1/64 減速機付きモータ1回転200ステップ直接駆動
モータードライバーUNL2803 トランジスターアレイA4988 1/16 マイクロステップ
マイコンArduino unoESP32 WiFi/Bluetooth


使用ライブラリーについて
A4988モータードライバーを使うために既存のライブラリーを色々テストした結果、A4988ライブラリー内の
BasicStepperDriver.h、MultiDriver.h、SyncDriver.hをincludeしてcontroller.rotate()を使うことにしました。
このライブラリーには、ステップ数を制御する関数が無いのでcontroller.rotate() 回転角度関数をステップ数に
変換することにより解決しました。
StepperDriverのダウンロードはこちらから

ハードウエアのキャリブレーション用ファームウエア (WiFi 機能を省略しています)
例としてwheel_dia = 70.0; wheel_base = 90.0;として説明してますが、実際の寸法を測定して入力した後、
キャリブレーションを実行して1辺が100㎜の正四角形になるように微調整を行います。

CCW(反時計回り)の場合
wheel_diaパラメータの調整
正方形の一辺の長さが100㎜より長い場合は、wheel_diaの値を増やし、短い場合は値を減らします。
wheel_baseパラメータの調整
旋回角度が90度より狭い場合は、wheel_baseの値を減らし、90度より広い場合は値を増やします。



キャリブレーション用ファームウェアを用意しました。
OSTR_Paradise_Model_Calibration.html


次回は、WiFi UDPを使ったファームウエアとスマホAPPの使い方を説明します。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Open Source Turtle Robot (OSTR) その3

コントロール回路の説明
先ずは、instructablesに紹介されたDrawing Robot for Arduinoを参考にご覧下さい。
OSTRのオリジナルでは、減速機付きユニポーラ型ステッピングモータをUNL2803トランジスターアレイにて駆動しています。
私は、手持ちの部品を活かす事とギアモータのバックラッシュが気になり、1回転200ステップのステッピングモータを使い、
A4988モータドライバーにてマイクロステップを1/16に選択、1回転3200ステップの直接駆動としました。
また、マイコンにESP32を使い、WiFi経由でスマートフォンのフリーアプリからリモート操作ができるようにしました。

回路図
ESP32チップは、専用基板を介さずにユニバーサル基板に裏向きに張り付けて使いました。ESP32にはI/O端子が沢山
ありますが、使ってる端子は僅かです。残りのI/O端子は工夫次第で追加機能に生かせます。
制御電源は、ROHM社の基板用DC/DCコンバータにて3.3Vに降圧、ESP32、A4988、サーボモータに供給しました。
また、ソースファイルの書き換え用にUSBシリアル変換モジュール用端子や書き込みスイッチを設けています。
OSTR_ESP32_A4988_Circuit.gif

コントロール基板
主にA4988が2個とESP32を小さなユニバーサル基板に組み込んだ簡単な回路です。
左右のモータドライバーA4988は、電流制限用ポテンションメータにて夫々約200mAに設定しています。
OSTR_No3_ESP32_PCB.jpg

バッテリーボード
先にも述べましたが、デジタルカメラCanon EOS-7Dの使い古したリチウムイオン電池を流用しました。
バッテリー保護カバーに電極を取り付け、バッテリーの取り外しがワンタッチで行えるようにしています。
OSTR_No3_assembly6-1.jpg

モーター電源用DC/DCコンバータ
MT3608使用の昇圧型DC/DCコンバータをバッテリーボードの裏側に取り付けています。
OSTR_No3_assembly6-2.jpg

新しい動画をご覧下さい。



次回から、ソースファイルとスマホのAPPについて説明します。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Open Source Turtle Robot (OSTR) その2

フレームの工作
OSTRは工作の精度が要求されます。精度が悪いと描画に大きく影響します。
私は手持ちの部品を使う関係で、アクリル板をCNC加工してオリジナルのフレームを作りました。
Arduinoを使ったDrawing Robot for ArduinoのチュートリアルページからPDFファイルがダウンロードできます。
また、フレームの製作に必要な3Dプリンターのデーターもダウンロードできます。
しかし、この場合は指定の減速モータを使う必要が有ります。このモータはAmazonにて安価に入手可能です。

部品
私と同じ部品の入手が難しく切削データを記しても役立たないので画像のみを参考に紹介します。
ステッピングモータ:39㎜角を使用、数年前に倒立振子2輪ロボット用に購入した新古品で今は入手不可
ボールキャスター:タミヤ模型の楽しい工作シリーズ No.144(2個入り)300円弱
サーボモータ:SG3.7型RCサーボを使用しましたが、入手し易いSG90型でも可
ホイール:厚さ3㎜アクリル板を外径64㎜に加工、厚さ1㎜外径68㎜のリング張り合わせ式(作り方を後述します)。
タイヤ:Oリング 1A G-55 内径55㎜太さ3.1㎜ 2本セット(ヨドバシカメラ)を100円弱で購入。
OSTR_No3_AllParts.jpg

組み立て参考画像
①サイドパネルにステッピングモータをビス止め、サイドパネルをベース板(t5アクリル板)にねじ止めします。
OSTRのチュートリアルでは、ペンガイドが本体に固定していてその中をペンが上下しますが、私はベース板とトップパネルに
10㎜の穴を開け、ペンと一体のスリーブが上下する構造としました。 注意、上下の穴が同心円状にあることが重要です。
OSTR_No3_assembly1.jpg

②トップパネル(t5アクリル板)を左右サイドパネルの間にビス止めします。(サーボ―モータは取り付け済み)
OSTR_No3_assembly2.jpg

③前後パネル(t3アクリル板)をビス止めします。(今回からアクリル板の止めネジに2㎜のタップタイトを使い始めました)。
OSTR_No3_assembly3.jpg

④リア―パネルにコントロール基板を取り付けします。(コントロール基板の製作は次回にします)
OSTR_No3_assembly4.jpg

⑤左右のホイールを取り付けます。
この時ベース板が水平になるようにキャスタの高さを調整します。傾いている場合、360度回転するとペン先が点にならずに
円を描くことになります。また、ホイールベース(ここでは左右タイヤの中心間距離)の中心にペン先がない場合も同様です。
OSTR_No3_assembly5.jpg

⑥の1 バッテリーボードを取り付けます。 バッテリーはCanonのデジイチ用LP-E6 7.2Vリチウムイオン電池を使いました。
OSTR_No3_assembly6-1.jpg

⑥の2 バッテリーボードの裏側に昇圧型DC/DCコンバータ(MT3608)を取り付けて12Vを得ています。
OSTR_No3_assembly6-2.jpg

⑦コネクター類を差し込み組み立てが完了しました。
OSTR_No3_assembly7.jpg

⑧フェルトペンの加工、アルミパイプ外径10㎜にフェルトペンを挿入しますが、ストレートの太さのペンが少なく適当な
品を探すのに苦労しました。私は、サクラクレパスFK-M#49 [フェルトペン 中字]を内径9㎜に入るように少し胴体を削って
動く程度の硬さに挿入しました。これは、使用後ペン先にキャップをする必要があり、抜き差しをするためです。
また、ペンを上下させるためのサーボホーンを受けるカラーはt5アクリル板を外径23㎜、内径10㎜のリング状に加工し、
止めねじ用のM2タップを外周の1ヶ所に設けています。
OSTR_No3_Pen.jpg

ホイールの製作について
OSTRでは、ホイールの精度が描画に大きく影響します。真円度やシャフトに取り付けるハブのブレ等に注意が必要です。
私はこれまで、タイヤが入る溝をボール盤を利用して削っていましたが、今回はt3アクリル板を外径64㎜にCNC加工し、
両側にt1アクリル板のリング外径68㎜を張り合わせました。リングがズレないように6ケ所に合わせ穴を設け、爪楊枝を
差し込んでから、アクリル接着液で固定します。 タイヤには内径55㎜、太さ3.1㎜のOリング1A G-55をはめ込みました。
HUBは外径22㎜ t8アクリル板をCNC加工して作りました。M3セットスクリューにてモータシャフトに固定しますが、内径が
5.0㎜ジャストでシャフトと遊びがないようにします。少しでもガタがあるとホイールにブレが生じるので注意が必要です。
HUBのホイール取付穴にM3のタップ加工をします。
OSTR_wheel_set.gif

最後に余談ですが、最初はコントロール基板とバッテリーを前後に配置していましたが、前後の重量バランスが良すぎて
モータ起動時にキャスターが持ち上がる不具合が有り、不細工となりますがキャスター側に部品を集合しました。
OSTR_No3_08.jpg


次回は、制御回路の詳細を順次掲載します。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Open Source Turtle Robot (OSTR) その1

Open Source Turtle Robot (OSTR)を作ってみました。
instructablesで見つけた文字や図形を描く(亀さん)ロボットOSTRを参考にしました。
私は、手持ち部品の活用と丸切りのコピーでは面白くないのでオリジナルと全く違ったロボットに仕上げました。
ここをクリックするとDrawing Robot for Arduinoのページが開きます。

先ずは動画をご覧下さい。新しい動画に差し替えました。


チュートリアルでは減速機付きのステッピングモーターを使っていますが、私は1回転200ステップのモーターを使い、
マイコンにWiFiが使えるESP32、モータードライバーにA4988を使い1/16マイクロステップで動かしました。
フレームやホイールはアクリル板をCNC加工して組み立てました。このロボットを正確に動かすには精度が要求されます。
OSTR_No3_12.jpg

小さなユニバーサル基板に回路を組み込みました。
ESP32は、裏返しにして基板に両面テープで接着、ESP32の端子と基板をジャンパー線で配線しています。
電源には7.4Vのカメラ用リチウムイオン電池を使い、モータードライバにはDC/DCコンバータで12Vに昇圧して供給。
ESP32の電源には、前回紹介のROHM社3.3V1A、DC/DCコンバータを使って供給しています。
No3_PCB.jpg

フリーアプリのWiFi UDPを使ってコントロール
コントロールにはスマートフォンのWiFiアプリを使い、図形やフォントデータを選べるようにしました。
WiFi_UDP_Controller2.jpg


次回から工作、回路、ソフトの詳細を順次掲載します。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

ROHM社の三端子型DC/DCコンバータの紹介

78-XXタイプの三端子レギュレータとピンコンパチで置き換えが出来て重宝!

画像は3.3V1AタイプのBP5293-33ですが、5V1Aと12V1Aタイプが用意されています。
ROHM_BP5293-33.jpg

バッテリー駆動の電源回路において入出力間の電圧差が大きい場合、レギュレータの発熱対策が必要です。
ここに紹介しましたROHMの三端子型DC/DCコンバータは発熱が殆ど無く、それにコンデンサーが内蔵なので
外付け部品が少なくて済みます。但し、形が少し大きくトップヘビーな割に端子の材質が柔らかく、取り付け
後に接着剤で固定しないと疲労破断が起きそうなのが難点です。

使い始めた切っ掛けは、3Sタイプのバッテリー(約12V)からマイコン用の3.3V電源を得るのに通常の三端子
レギュレータを使えば発熱対策のヒートシンクが大きくなります。小型の代替品を探してこの製品を見つけました。
価格が少し高くなりますが、コンデンサーやヒートシンクが要らないので問題外です。
ESP32の電源に使いましたが出力リップル電圧も問題なく正常に動作しています。

この製品は秋月電子にて購入しました。詳細は以下のページにPDFのデータが添付されているのでご覧下さい。
ROHM BP5293


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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

M5 Stack ATOM Lite を使って倒立振子型ロボットを作る その3

2020年6月25日
私は、後期高齢者の爺さんですが、若い方に科学や工作について興味を抱いて欲しいと願っています。
EVO2_ATOM.jpg

EVO2用ESP32ソースファイルの紹介
先ずは、B-ROBOT EVO2用にESP32のソースファイルを公開されたghmartin77氏への敬意と感謝を申し上げます。
ESP32を使うことにより、原形のB-ROBOT EVO2に比べ回路の簡素化により部品点数が少なくなりました。
GitHub B-ROBOT EVO2 ESP32を開きます。
BRobotEvo2ESP32を開くと1番上のBRobotEvo2ESP32.inoはダミーファイルで、4番目のESP32SelfbalancingBot.cppが
本当のソースファイルなので拡張子をcppからinoに変更します。
次にそれ以外の12個のファイルは、libraryファイルなのでフォルダー名をBrobot等と付けた中にコピーし、Arduinoのlibraryに
インストールします。

M5stack ATOM Liteを使うためのコード変更
ghmartin77氏のGithubでは、ESP32 DevKitを使ってますが、私は小さく作るためにM5stack ATOM Lite(技適証明付き)
を使いました。
そのために使用するGPIOの番号を変更する必要があります。GPIOがバラバラなのは、プリントパターンを優先した結果です。
変更箇所はlibraryのdefines.hなのでテキストエディタ等で次の部分(11行目から)を編集します。
#define PIN_ENABLE_MOTORS 1219
#define PIN_SERVO 1732
#define PIN_MOTOR1_DIR 2726
#define PIN_MOTOR1_STEP 1433
#define PIN_MOTOR2_DIR 2523
#define PIN_MOTOR2_STEP 2625
以上の6行を書き換えたら保存を忘れずに行います。
注意:ESP32では、I2CのGPIOが21pin=SDA22pin=SCLと規定されているので手組で配線される方は忘れずに!
BrobotEvo2_03.jpg


ArduinoIDEでの書き込みについて
ここでは、M5stack ATOMの特別な機能を使わないので"M5Atom.h"を#includeする必要がありません。
ボードの選択は標準のESP32 Dev ModuleでOKです。
注意:Upload Speedは115200に設定します。これより早いと書き込みエラーが出ます。
ATOM_Lite_IDE1.jpg

コントロールソフトについて
B-ROBOT EVO2開発元のJJrobots社がスマホ用アプリ[JJrobots control APP]を無料公開されています。
android用はGooglePlay、iPhone用はApp Storeにてダウンロードして下さい。
APPの使い方は、JJrobots社のホームページにてご覧下さい。
JJrobots社のホームページには、倒立振子2輪ロボットの原理の他、参考になる情報が満載です。
EVO_APP.png

遊び方
完成したら動かせてみましょう!机の上などは落下の危険があるので広い場所で行って下さい。
①本体を寝かせて電源スイッチをON。
②暫くするとアームが小刻みに動いた後静止します。(自動キャリブレーション)
③スマホのWiFi設定をタップすると利用可能なネットワークに「bbot」と表示されていると思います。
④「bbot」をタップしてパスワード[12345678]を入力設定します。
⑤少しすると接続済みになります。
⑥スマホにインストール済のJJrobots control APPを起動します。
⑦APPの右側SERVOボタンを押すとアームが本体を起こして自動的に倒立します。 左側のSERVO2は実装していません。
⑧後は、前後と左右のスライダーを動かす事により、思い通りに動かせます。
 各スライダーは画面から指を離すと中立点で停止します。
⑨PROボタンを押すと動作スピードがアップしますが、普通モードで慣れてからでないと操作が難しいです。
海外ではサーキット・コースを作り、競技会が行われています。何人かで遊ぶと楽しいと思います。

機能を追加して楽しむ
M5stack ATOMを使った場合は、GPIOを全部使って余りが無いので無理ですが、GPIOに余裕があるESP32 DevKitや
ESP32単体に置き換えると、各種センサーを取り付けて障害物を避けながらの自動走行やライントレースを楽しむなど、
工夫次第で色々と発展させることが出来ます。

自作出来ない方のためにキットの販売も有りますが・・・
JJrobots社ではキット販売を行っていますが、使っているWiFiチップが日本国内で使えない技術適合証明が付いていない
ので注意が必要です。

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


最後までご覧頂き有難うございました。

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


良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

M5 Stack ATOM Lite を使って倒立振子型ロボットを作る その2

2020年6月23日
先は動画をご覧下さい。
キビキビ走り回る安定度抜群の倒立振子型2輪ロボットです。前面カバーに幼児が好きなドラえもんのイラストを借用しました。


1)ボディの工作について
私と同じ部品の入手が難しく、切削用のDXFファイルを添付しても役に立たないと思います。
と言うのは、ここで使用したステッピングモータ39㎜はオリジナルマインド社の新古品を利用しましたが、今では入手出来ません。
一般的には国内で入手し易い42㎜(NEMA17)タイプを使うことになります。

その他の工作については5年前の記事になりますが、下記URLのB-ROBOT3号機iの紹介記事を参考にして下さい。
http://kishiwada2.web.fc2.com/CNC/B-Robot3.htm

2)コントロール基板の回路図
今回製作目標の一つ小型化を実現するのに超小型のM5 Stack ATOM Liteを使いました。
ATOM Liteには、ESP32picoが組み込まれています。しかし、GPIOが最大8個しか使えませんが、B-ROBOT EVO2に必要な
要件を最小限ですが満たしています。但し、標準機能以外の拡張性が有りません。
ATOM Liteの3.3V出力電流の容量が僅かなので、別途3.3V500mAの電源を用意しました。
尚、GPIOの出力先がバラバラなのは、プリントパターンを優先した結果です。 IO26と32がPH2.0 4Pコネクターから出力
されていますが、本当はここにIO21と22を出してほしかった。その理由はI2Cラインが便利に使えるからです。
Brobot_EVO2_circuit1.gif

3)CNC切削でプリント基板の作製
簡単な回路なのでユニバーサル基板で作れますが、生基板にCNCでパターンを切削しました。
下の画像は実寸より大きいですが、実際の寸法は55㎜X55㎜の正方形です。但し2個所ジャンパー線が必要です。
基板切削用DXFデータのZIPファイルをダウンロード出来ます。
BrobotEvo2_PCB1.gif


4)組み立て済の基板を参考にして下さい。
ATOM LiteとMPU6050の間隔が狭かったので上記プリントパターでは少し間隔を広げてます。
BrobotEvo2_03.jpg

5)電源について
私は手持ちのデジカメ用7.4Vリチウムイオン電池を使いましたが、純正品が高価なので互換品を使っています。
参考:Canon純正型のNB-10L(ロワ・ジャパン)880円をAMAZONにて購入。
新たに用意される方は、3S(11.1V)タイプのLipo電池を使う方法があります。その場合はDC/DCコンバータが不要です。
NB-10Lの電池ケース加工方法はB-ROBOT3号機の紹介記事を参考にして下さい。

次回はghmartin77氏がESP32用に作成され、Githubに公開されたソースファイルを
M5 Stack ATOM Liteへの変更点などを紹介します。



良かったらclickして下さい!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

M5 Stack ATOM Lite を使って倒立振子型ロボットを作る その1

2020年6月17日
5年前にjjrobots社のB-ROBOTを4台作りましたが、今回B-ROBOTにESP32を使った海外の記事が目に留まり、
5台目を作ってみました。 作っての感想は抜群の安定性で皆さんにお勧め出来る性能です。
参考にした記事ではESP32DevKitを使ってましたが、私は超小型のATOM Liteを使って完成させました。

完成したB-ROBOT Evo2 (前後のカバーを撮影用に外しています)。
BrobotEvo2_01.jpg

今回使った全パーツ
ステッピングモータの下側が片面生基板をCNCでパターンカットしたPCBでサイズは約55X55㎜角に纏めました。
モータドライバA4988が2個並ぶ左下が24x24㎜角のATOM Liteで、その横がMPU-6050 3軸ジャイロセンサーです。
バッテリーはキャノンのデジカメに使われている7.4Vリチウムイオン電池を流用しています。
ボディやホイールは何時ものように3㎜と5㎜のアクリル板をCNC加工して作りました。
BrobotEvo2_02.jpg

次回から製作についての詳細やソフトウエアーのお話を順次掲載します。



良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Theo Jansen Mechanism series No.9 その8

2020年6月10日
スマホのリモコンアプリとM5 Stack ATOM Liteを使ってTJ9をPWM制御します。

1)スマートフォン用アプリについて
スマホのリモコンアプリはその6で紹介しましたMovicMaker Controller Arduino Bluetooth RCを使います。
アプリはGoogle Playにてダウンロードして下さい。また、使い方はその6を参照して下さい。

2)M5 Stack ATOMを使う準備
①Arduino IDEのインストール
ここでは、Arduino環境でソースファイル(スケッチ)を作成します。このため、PCにArduino IDEの準備が出来ている
事を前提とします。
M5 Stack ATOMにはESP32 Picoが使われているのでESP32 libraryを前もってインストールする必要があります。
ここをクリックするとGitHub Arduino ESP32 Libraryを開きます。

②Arduino IDEにM5 Atom Libraryをインストールします。
次の画像のようにArduino IDEのスケッチ⇒ライブラリをインストール⇒ライブラリを管理の順番にクリックすると
下画像のライブラリマネージャが開きます。
Arduino_Library1.jpg

③下画像のようにM5Atomと入力してインストールを行います。
M5Atom_Library1.jpg

④ここでは、ATOM Lite内蔵のRGB LEDを使用します。
そのために、必要なFastLED Libraryを下画像の手順で予めインストールしておきます。
FastLED_Install.jpg

⑤ボードはESP32 Pico Kitを選択します。
また、ATOM Liteは、Upload Speedを115200に下げないと書き込みエラーが出てしまいます。
ソースファイル(スケッチ)の書き込み前に必ず設定を変更しておきます。
余談ですがUpload Speedを115200下げれば、ボードをESP32 Dev Moduleを選んでも書き込みが出来ています。
ESP32_Pico_Kit.jpg

3)ソースファイル(Arduino sketch)の説明
先ずは次のソースファイルをご覧下さい。
内容は、その6の2)コントローラーにスマートフォン使った方法の②Bluetoothアプリに対応したTJ9 ESP32用を
M5 ATOM Liteに変更した関係でGPIO番号が異なるのこと、モータ制御をPWMに変更したことが主な違いです。
クリックしてソースファイルを開く TJ9_ATOM_BT_PWM.html

先ずは使用するlibraryをincludeします。
#include "M5Atom.h"//M5Atom Libraryを使います。
#include "BluetoothSerial.h"//BluetoothSerial Libraryを使います。
BluetoothSerial TJ9_ATOM_BT; //BluetoothSerialに名前を付けます。

今回は、駆動モータをPWM制御します。
駆動モータは性能にバラツキがあり、左右に回転差が出て直進せずに左右何方かへカーブすることが有ります。
モータドライバーをON/OFFのデジタル信号で制御する場合は左右の回転差を補えませんが、PWM制御を使うと
回転差の補正が出来ます。
M5 Stack ATOMはESO32-Picoを使っている関係上、Arduinoと同じアナログ入力を使ってのPWMが使えません。
そこで代わりにESP32のLEDC()関数を使いPWM制御を行います。
LECD関数()
①ledcSetup(0, 500, 8)は、( チャネル番号、周波数(Hz)、dutyビット長)PWMの仕様を定義しています。
②ledcAttachPin(M_IN1, 0)は、(ピン番号又はその変数、 チャネル番号)を定義しています。
③ledcWrite(0,255)は、(チャネル番号, duty-は8bitなので0~255の値)

旋回方法の選択を追加
スマートフォン・アプリMOVICのA/Bボタンを利用して旋回方法を切り替える機能をs追加しました。
Aボタン=起動時に初期設定:左右のモータを逆方向に回転させてその場で方向を変えます。(超信地旋回)
Bボタン=前進/後進しながら旋回方向側モータの回転を下げて円弧を描いて旋回します。(円弧旋回)

ATOM LiteのRGB LED表示器を状態表示に使用
ATOM Liteの押しボタン中央にRGB LEDが付いています。折角の標準装備なので、進行方向の状態をカラーで
表示させました。
注意:このRGB LEDを使うには、2)M5 Stack ATOMを使う準備の④で説明しましたFastLED Libraryがインストール
されていないとエラーが出ます。
前進:白色、後進:赤色、左旋回:青色、右旋回:マゼンタ、停止:緑色に夫々設定してます。
補足ですが、TJ9には先に点滅式の方向指示器を付けてあるので同様の表示器が二重となりました。
点滅式の方向指示器を省略すれば、4個のGPIOが他の用途(自動歩行用センサー等)に回せます。


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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Theo Jansen Mechanism series No.9 その7

2020年6月6日
制御部にコンパクトなM5 Stack ATOM Liteを使った方法
M5 Stack ATOM LiteはM5シリーズの中でも24×24㎜の正方形で一番コンパクトなモデルで価格も手ごろです。
TJ9の製作に当たり、当初からATOM Liteを使う予定でしたが、コロナ禍の国際物流の混乱によって入荷が遅れ
5月末にやっと届いたのでESP32からATOM Liteに置き換えました。ATOM LiteにはESP32-PICOが使われて
いるのでソースファイル等には大きな変更無く使えます。

M5 Stack ATOM Liteの概要
M5_AtomLite.jpg

TJ9 Control Board
左側がESP32を搭載したモデル、右側がM5stack ATOM Liteを搭載したモデルです。
TJ9_Control Board1

制御部回路の説明
単体のESP32と違いUSBシリアルなど最小限必要な機能がオールインワンされているのでモータドライバー基板を
接続すれば出来上がりと言った具合です。但し、電源入力が5VのみなのでUSBケーブルを接続時以外は外部から
5Vを供給する必要があります。私は安価な昇圧タイプDC/DCコンバータを使い3.7Vから5Vを得ています。
注意:IO26とIO32はピンソケットではなく、PH2.0-4Pソケットなので別途入手が必要でした。
TJ9_ATOM_Circuit1.gif

TJ9にコントロール基板をセットした様子
ATOM Liteを使うとESP32単体の場合に比べて周辺がスッキリと仕上がりました。
ユニバーサル基板にATOM Liteの取り付けは、ユニバーサル基板に4ピンと5ピンのピンヘッダーを取り付けて
上から差し込むだけです。ユニバーサル基板ランド側でモータードライバー基板と配線しています。
尚、DC/DCコンバータは基板取り付け台の裏側に取り付けています。
TJ9_Atom2.jpg

M5 Stack ATOM Liteに置き換えて出来上がった"TJ9_ATOM"です。
ATOM Liteには押しボタン部にRGBカラーLEDが付いています。折角付いてるのだからと方向指示に連動して
LEDの色が変わるようにしました。前進:白色、後進:赤色、左旋回:青色、右旋回:マゼンタ、停止:緑色としました。
USBソケットはマイクロCタイプです。A型のアクリル板を加工した白いアームはTJ9の持ち上げ用の取っ手です。
TJ9_Atom1.jpg

動画をご覧ください。



次回はスマホのリモコンアプリとPWMを使ったソースファイルを紹介します。

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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Theo Jansen Mechanism series No.9 その6

20220年6月2日
TJ9本体とコントローラーのソースコードを記します。
今回はESP32のBLE(Bluetooth Low Energy)をリモコンの媒体としてTJ9本体と専用コントローラーに使います。
また、Bluetooth Classicを使いスマートフォンの無料アプリからTJ9を操作する2種類の方法を用意しました。
各ソースファイルはArduino IDEにコピーしてお使い下さい。

1)BLEを使った方法
①TJ9側ソースファイル
今回製作のトは、Bluetoothを使ってTJ9を操作する基本をお伝えする事にあり、TJ9を前後と左右の旋回のみ
操作に限定していますが、各種センサーを用いて自動歩行などの機能を追加発展させることが可能です。
ソースファイルを開きます。:TJ9_CrossKey_RX.html
Arduino IDEにESP32libraryをインストールすると自動的に添付されるスケッチ例のnotifyを応用したものです。
補足説明:
#define SERVICE_UUID "********-****-****-*****-************"
#define CHARACTERISTIC_UUID "********-****-****-*****-************"
#define DEVICE_NAME "esp32_BLE"
ここで大事なのは、https://www.uuidgenerator.net/version4からUUIDコードを2組ダウンロードしてソースファイルの
SERVICE_UUID とCHARACTERISTIC_UUID"********-****-****-*****-************"に置き換えて下さい。 
また、UUIDとDEVIC_NAMEはコントローラー側と同じ必要が有ります。
ここでは、モータドライバーの回転方向の切り替えと進行方向を示すLEDの表示切替程度ですが、LEDの点滅には
unsigned long previousMillis = 0; unsigned long interval = 200;を使って200mS毎のON/OFFを行っています。
その他特に難しい事は行っていません。

②コントローラー側ソースファイル
今回も幼児にも扱い易いクロスキーの専用コントローラーを作ってみました。
専用コントローラーを作るのが面倒な方は次項のスマートフォンを使った方法を選んで下さい。
ソースファイルを開きます。:TJ9_CrossKey_TXa.html

2)コントローラーにスマートフォン使った方法
①アプリの選択と設定
BLE用リモコンアプリがBluetooth Classicに比べて極端に少なく、使い易いアプリが見つかりませんでした。
そこで仕方なく、沢山あるBluetooth用リモコンアプリの中から次のアプリを選びました。

私が選んだMovicMaker Controller Arduino Bluetooth RCはAndroid用のスペイン語アプリですが、とても使い易くて
TJ9を操作するのにピッタリです。Google Playにて無料ダウンロード出来ます。 
残念ですが、iPhoneを持ってないのでiPhone用アプリが存在するのか不明です。
MovicMaker1.jpg

インストールが完了したら画面左上の3本線をタップすると下画像のConfig画面に切替わります。
MovicMaker2.jpg

画像と同じようにF,B,L,R,Sの順番になっていればOKです。違っていれば修正します。修正後は画面を一番下に
下げてGuarderにて保存します。AとB及びヘッドライチやホーンなどの操作も可能ですが、今回は使用しません。
MovicMaker3.jpg

Bluetoothのペアリングは画面右上のBluetoothマークをタップすれば、スキャン機能によって近くのBluetooth電波を
キャッチしてリストアップします。そのリストからTJ9_ESP32_BTを選択します。
起動後、PRESIONE ESTA ZONEをタッチ及びスワイプすれば、前後と左右旋回が行えます。タッチを離せば停止します。

②Bluetoothアプリに対応したTJ9用ソースファイル
BLEをBluetooth Classicに変更しただけで基本的な動作が同じです。
ソースファイルを開きます。:TJ9_BT_ESP32_RX.html


次回は、超コンパクトなM5 Stack ATOM Liteを使った方法を紹介します。
24X24㎜、厚さ10㎜の超小型 ATOM Lite に置き換えました。
TJ9_Atom2.jpg


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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Theo Jansen Mechanism series No.9 その5

2020年5月30日
Theo Jansen Mechanismに興味のある方に簡単に作って貰えるよう、今回は自動走行モードなどを載せず、
Bluetoothリモコンで操作するだけの基本部分としました。珍しい回路を付けてませんが、I/O端子に余裕が
あるので前後左右への移動に合わせ、点滅する方向指示LEDランプを設けました。

制御部の回路図
当初の予定ではマイコンにM5stack ATOM Liteを使う予定でしたが、コロナ禍で国際貨物の混乱のために
届きませんでした。仕方なく手持ちのESP32チップを使い組み上げました。
動力の超小型サーボモータSG3.7GのPWM基板とぽテンションメータを取り除き、単なるギアモータとして
使っています。このためにL298P互換チップが載った小さいモータドライバー基板を取り寄せて使いました。
電源には3.7Vのリチウムイオン電池を使い、ESP32の3.3V電源にはシリコンダイオードの順方向の電圧降下
を応用して3.3Vを供給しています。また、スペースが有るので電池を2個並列にしました。
TJ9_Circuit.gif

下の右側が今回使用したSG3.7Gです。左側の工作によく使われるSG90Gタイプに比べて一回り以上小型です。
サーボモータはPWM回路の可変抵抗を静止ポイントに固定すれば連続回転として使えますが、周囲の温度変化
によって静止ポイントが移動する欠点があります。このために元のPWM回路を使わずにモータドライバーを使用
しています。 中央の小さな基板がL298P互換の2回路モータドライバーでPWMにも使えます。
TJ9_13.jpg

BLE(Bluetooth Low Energy専用リモコン
リモコンにはスマホも使えますが、幼児でも操作が出来る専用リモコンを作りました。スマホを使う方法を次回に記します。

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

タクトスイッチを使ったクロスキーボード
下がユニバーサル基板にタクトスイッチとシーソー式の十字板を組み合わせた物です。右側のシーソーボタンは
今回使いませんが何時でも使えるように組み込みました。シーソー板は大きく見えますが長辺が24㎜です。
TJ9_CrossKey1b.jpg

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


次回は、本体とリモコンのソフト及びスマホを使ったリモコンを紹介します。

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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Theo Jansen Mechanism series No.9 その4

2020年5月29日
動画が先に編集出来ましたのでご覧ください。


次回は回路図、ESP32のソフトウェア、BLEを使ったリモコンについて紹介します。

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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : 工作の作品
ジャンル : 写真

Theo Jansen Mechanism series No.9 その3

2020年5月23日
今回の作品はスマホを使ったBLE簡単リモコンにしました。

先に完成してたTJM_No.9に搭載する予定のM5Stack ATOM Liteがコロナ禍の物流混乱で入荷しませんでした。
仕方なく、手持ちのESP32とやっと届いたL298p搭載のモータードライバーを使って組み上げました。
部品が載る中央架台は50X90㎜の大きさです。
TJ9_ESP32_BLE_1.jpg

マイコンにESP32Dを使いスマホからBLE(Bluetooth Low Energy)信号でコントロールします。
電源は3.7V750mAhのリチウムイオン電池を2個並列に接続。今回使用のサーボモータはPWM制御回路を取り除き、
単に連続回転のギアーモータとして使うためにモータードライバーが必要で、21X24㎜の超小型基板にL298pを搭載した
モータードライバーを初めて使いましたが、小さなモーターを動かすのにGooDです。1枚送料込みの70円ほどで購入。
TJ9_ESP32_BLE_2.jpg


次回は回路図、ESP32のソフトウェア、BLEを使ったリモコンについて紹介します。

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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : 工作の作品
ジャンル : 写真

Theo Jansen Mechanism series No.9 その2

2020年5月3日
注文部品の到着が遅れていてコントロール回路が作れず、先にTJ9プラットホームの製作を先に掲載します。
正確な寸法に作るにはCNCフライス盤が必要となります。

このプラットフォームを作ります。
サイズ:高さ88㎜、前後最大170㎜、幅150㎜
TJ9_01.jpg

プラットホームの主な使用部品
2㎜厚アクリル板 230×110㎜:1枚、220×100㎜:1枚、190×100㎜:1枚
3㎜厚アクリル板 60×30㎜:1枚
5㎜厚アクリル板 100×60㎜:1枚、100×50㎜:1枚
1.2㎜厚ポリプロピレン板(半透明バインダー表紙の再利用品を使用) 300×115㎜:1枚、75×40㎜:1枚
2㎜径真鍮丸棒(光モール・定尺1m)150㎜:2本、120㎜:1本、11㎜:8本
3㎜径真鍮丸棒(光モール・定尺1m)18㎜:8本
外径3㎜・内径2㎜アルミパイプ(光モール・定尺1m)80㎜:1本、46㎜:2本、11㎜:6本、5㎜:8本
M3薄型(厚さ0.4㎜)ステンレスワッシャー:8枚
M3ボルトL20㎜及びナット:各8個
M3イモネジL6㎜(ホーローセット):12個
ステンレス釘(直径約1.28㎜、長さ約12㎜):40本
駆動モーター:SG3.7Gマイクロサーボーモータ(秋月電子FS0307)
新規購入には秋月電子のFM90ギヤードモータ(¥250)をお勧めしますが、少し大きいので設計変更が必要です。

概略図
Theo Jansen氏が公表している基準サイズに0.6575342を掛けたサイズに縮小しました。
注意:何れの画像も実寸ではありません。実寸は各DXFファイルを参照して下さい。
切削用各DXFファイルをZIPファイルにまとめてダウンロードできます。

TJ9_size.gif

ギアーボックスとスペーサー
2㎜厚アクリル板を使用(DXFファイルTJ9_02_body1_2㎜を参照して下さい)
ギアーボックスを構成するモータ側と反対側の2枚のパネルの間隔が内側11㎜です。
図面には出てませんが、外径8㎜内径3.1㎜厚さ5㎜が1枚と厚さ3㎜が2枚を接着してスペーサーを作ります。
両側パネルの間に、この長さ11㎜スペーサーを入れて長さ20㎜のM3ボルト・ナットにて固定します。
また、ギアーとパネルが接触しないように薄型M3ステンレスワッシャーを入れてます。
モータ側パネルのモータ取付穴径1.6㎜に2㎜のタップを忘れずに切っておきます。
TJ9_body1b.gif

コントロール回路を載せる中央架台
2㎜厚アクリル板を使用(DXFファイルTJ9_02_body2_2mmを参照して下さい)
架台の両側パネルと上パネルは、ほぞ組してアクリル接着剤にて接着します。
TJ9_body2.gif

脚部上下の三角パネル
1.2㎜厚PP(ポリプロピレン)板を使用(DXFファイルTJ9_02_Foot_2mmを参照して下さい)
注意:上側の三角パネルは、b辺とd辺の寸法が異なり、b辺の方が少し長いので組付け時に確認が必要です。
TJ9_Foot_b.gif

脚部連結ロット
2㎜厚アクリル板を使用(DXFファイルTJ9_02_Lot_2mmを参照して下さい)
TJ9_Lot.gif

クランク駆動用ギアーと固定用フランジ
5㎜厚アクリル板を使用(DXFファイルTJ9_02_gear_5mmを参照して下さい)
ギアーとフランジはセンターがずれないように3㎜シャフトを差し込み、アクリル接着剤で張り合わせます。
接着前にフランジ厚みの中央部からシャフト穴に向かって、2.5㎜の下穴を開けてM3タップを切ります。
シャフトとの固定にはM3イモネジを使います。
TJ9_gear_5mm.gif

サーボモータ用センターギアー
3㎜厚アクリル板を使用(DXFファイルTJ9_02_gear_3㎜を参照して下さい)
ギアー中央部にサーボモータのホーンが入るよう深さ1㎜のポケット加工を行います。
ホーンは中央から一番内側のピン穴の部分で両端を切断し、ギアーに挿入後瞬間接着剤にて固定します。
TJ9_gear_3mm.gif

クランク用アーム
5㎜厚アクリル板を使用(DXFファイルTJ9_02_Crankを参照して下さい)
クランク用アームにも2.5㎜の下穴を開けてM3タップを切り、M3イモネジでシャフトに固定します。
クランクの2㎜穴は貫通せずに1㎜残して長さ11㎜に切断した真鍮丸棒を瞬間接着剤で固着します。
TJ9_cam.gif

ステンレス釘の抜け止め板 外径5.5㎜、内径1.2㎜
1.2㎜厚PP(ポリプロピレン)板を使用(DXFファイルTJ9_02_LockRingを参照して下さい)
抜け止めは脚部を組み立て後に釘の尖端に押し込み、その後尖端をグラインダーで切除します。
TJ9_LockRing.gif

組み立て参考図(5月4日追加)
各部品の組み立て手順を簡単に図示しましたので参考にして下さい。
先にも述べましたが、上側の三角パネルのb辺とd辺の長さが異なるので注意して下さい。
図をクリックすると新しいページに拡大表示します。
TJ9_assembly.gif

組み立て参考画像1(5月5日追加)
クランクやギアーのイモネジの加工状態や組付け方を参考にして頂けます。
TJ9_07.jpg

組み立て参考画像2(5月5日追加)
組み上がった脚部を参考にして頂けます。サイドパネルにTheo Jansen Mechanism seriesと彫刻しました。
TJ9_08.jpg



次回はBLE(Bluetooth Low Energy)を使ったリモコンとM5Stack ATOM Liteを使った制御回路を紹介します。

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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : 工作の作品
ジャンル : 写真

Theo Jansen Mechanism series No.9 その1

2020年4月27日
約4年振りにテオヤンセンメカニズムの第9作目を作り始めました。
   これまでにテオヤンセンメカニズを応用してサボニウス型風車・ソーラーパネル・DCギアモータ・サーボモータなどを
  動力としたTJロボットをたくさん作り、これが第9作目となりました。

出来上がったTJ9プラットフォーム
TJ9_01.jpg

  今度の作品はこれまでで一番小さく、軽量に作る計画です。
  素材は2ミリ厚アクリル板と1.2ミリ厚PP(ポリプロピレン)板(バインダーの表紙を再利用)を使い軽量化しました。
  動力には先のTJ8と同様にRC用サーボモータをロータリー化して使いますが、今回は超小型のSG3.7Gを使いました。

前作TJ8と並んだ新作TJ9
TJ9_04.jpg

  上右側が2016年に作ったTJ8でSG90型サーボモータを使った作品です。(TJ8の詳細は過去記事をご覧ください)。
  TJ9には脚駆動用クランクを前後別々に設け、脚の間隔を広げたので胴長のダックスフンド・スタイルです。
  モータコントロールに使う部品の輸入配送が遅れ、完成まで時間が掛かりそうです。


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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : 工作の作品
ジャンル : 写真

CNC Mach3 RnR USB モーションコントローラーを使う その3

RnR USBモーションコントローラーをパラレルポート代わりに使う
Mach3のCNC設備を持ちながら、パラレルポートが使えるパソコンを入手出来ない場合に有効な手段です。

Mach3の項目設定例
1)Plugin
先ずは、RnRボード購入時の付録CD内のRnRMotion.dllをディレクトリー下のPraginディレクトリーにコピーします。
次にMach3を起動してMach3⇒Config⇒Config Pluginsを開くと左画像ダイアログのようにRnRMotionControllerが
インストルールされているのが確認できます。
次にPlugin Name右横のCONFIGをクリックすると右画像ダイアログのように設定してSAVEします。
RNR_config_Plugin.jpg

2)MotorOutput
私の場合で使用する機器に合わせた設定が必要です。
RnR_MotorOutput.jpg

3)Input Signals
Input#1~4がRnRボードの外部入力端子IN1~IN4に対応します。
ここでは、RnRボードのIN1にInput#1を割り当てE-Stop信号とリミットスイッチに共用しています。
残りのIN2~IN3をホームスイッチやプローブスイッチに使うことが出来ます。
RnR_InputSignals.jpg

4)Output Signals
Output#1~4がRnRボードの外部入力端子OUT1~OUT4に対応します。
ここでは、OUT1にEnable信号を、OUT4にSupidle信号を設定しました。
RnR_OutputSignals.jpg

5)Spindle Setup
ここでは、Relay ControlにOutput#「4」を設定してスピンドルのON/OFFをRnRボードのOUT4に出力しています。
RnR_Spindle_Setup2.jpg



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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : DIY
ジャンル : 趣味・実用

CNC Mach3 RnR USB モーションコントローラーを使う その2

RnR USBモーションコントローラーをパラレルポート代わりに使う
Mach3のCNC設備を持ちながら、パラレルポートが使えるパソコンを入手出来ない場合に有効な手段です。

RnRボードの改造
下の画像はRnRボードをパラレルポート代わりに使うために改造を施した物です。
注意:RnRボードに直接モータードライブ基板やリミットスイッチやスピンドルなどを接続する場合は改造の必要がありません。
RnR_Mach3_Board_3.jpg

回路図
注意:この回路図はHY-TB4DV用にD-sub25のピン番号を設定したもので、自身の機器に合わせてピン番号を変更して下さい。
RnR_Mach3_Controller2.gif

改造例:画像を参考に説明します。(画像をクリックすると拡大画像を別画面で表示)
RnR_Mach3_Board4a.gif
1)パラレルポートの仕様に合わせて外部入出力端子の電圧を24VからTTLレベルの5Vに変更します。
①E-Stopやリミットスイッチの信号を入力するIN1~IN4を5V対応に変更するため、既設フォトカプラLEDの電流制限抵抗を
元の3KΩチップ抵抗と並列に1KΩ1/6Wリードタイプの抵抗を取り付けます。(合成抵抗値が750Ωとなります)。
2)このボードのOUT1~OUT4各端子には必要とするアクティブHIGHの信号が取り出せません。
*基板内の改造が面倒な方には外付けにする方法を後述します。
ここではOUT1にEnable信号、OUT4にSpindle信号をアクティブHIGHとして取り出すためにフォトカプラを使いました。
②~⑤の各丸印が追加するフォトカプラの入出力ポイントです。
②黄色×印、出力ドライバーICからOUT1端子及びOUT4端子へのプリントパターンを途中で切断します。
各フォトカプラの出力を切断した端子側に接続します。
③ピンク丸印、追加フォトカプラの入力端子アノード側に接続、カソード側には1KΩ抵抗を介して出力ドライバーICの
青色丸印のGNDに接続します。
④青色丸印のGNDに追加フォトカプラのエミッタ出力側と10KΩの抵抗を介して接続します。
⑤赤丸印+5Vに追加フォトカプラのコレクター側をリード線にて接続します。

改造後の拡大画像(画像をクリックすると拡大画像を別画面で表示)
RnR_Mach3_Board_2.jpg

OUT1~OUT4に外付け部品を追加する方法
このボードのOUT1~OUT4は、Mach3の設定 Config⇒Ports and Pins⇒ Output Signalsの項目Output #1~#4に
よって機能を設定します。
OUT1~OUT4はオープンコレクター出力で、Output #1~#4の設定項目のActive Lowにチェックを入れるとRESETボタンが
ONの時にActive Lowとなりますが、チェックを外すとコレクターがオープンしたままで変化しません。
但し、Spindle Setup設定項目のOutput #1~#4にSpindle、Flood、Mist等を設定した場合はActive Lowのチェックを外す
必要があります。
例えばOUT4にスピンドルを設定する場合、Spindle Setup⇒Relay ControlのClockwise(M3)Output#を「4」に設定すると
G-Codeを実行した時にM3を読み込むとスピンドルが起動します。FloodやMistも同様です。
74LS04を追加した場合、必要とするアクティブHIGH又はアクティブLOW信号を簡単に選択できる利点があります。
74LS04.gif


次回はMach3側の設定を掲載します。


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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : DIY
ジャンル : 趣味・実用

CNC Mach3 RnR USB モーションコントローラーを使う その1

RnR USBモーションコントローラーをパラレルポート代わりに使う
Mach3のCNC設備を持ちながら、パラレルポートが使えるパソコンを入手出来ない場合に有効な手段です。
先に紹介しましたイーサーネット接続のEC300のUSB版です。

CNCコントロールソフトMach3は、Windowsの64bit版がサポートされていません。そのためWindows10のパソコンに
パラレルポート増設カードを追加しても使えません。
Windows10のパソコンに既設のパラレル入力機器が使えるように、USBモーションコントローラーを模擬パラレルポート
として使う方法を紹介します。
ここに紹介しましたRnR USBモーションコントロールボードは1500円程度で入手可能な安価なボードです。
RnR_Mach3_Board_3.jpg

回路図
RnRボードの外部入出力回路に24Vが使われてますが、少し改造して入出力を全てTTLレベルに合わせています。
この改造により、Windows10搭載のパソコンでMach3コントロールソフトや既設の機器が無駄なくも使えるようになります。
注意:この回路図はHY-TB4DV用にD-sub25のピン番号を設定したもので、自身の機器に合わせてピン番号を変更して下さい。
RnR_Mach3_Controller2.gif



次回はボードの改造方法やMach3の設定を詳しく紹介します。



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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

EC300モーションコントローラー対応にMPGを改造、その3

EC300モーションコントローラー対応にMPGを改造、その3

右側の画像がHIDキーボードと一体型に改良したEC300専用MPGです。
EC300_MPG1.jpg

前回の記事と併せてご覧ください。
先のMPGに使用したArduino Pro MicroとArduino Pro Miniへ書き込むソースファイルを添付します。

Arduino Pro Microを使ったHIDキーボードで、MPGに追加する操作部です。
Mach3の操作をパソコンのキーボードから離れ、手元で必要な操作が出来る便利グッズです。
ProMicro用ソースファイル
EC300_MPG_Arduino Pro Micro_Saucefile.html (左のURLをクリックすると開きます)。

デジタル式切り替え回路
EC300を機能させる為のプラグインソフトを組み込むとEC300の専用MPG端子を使う必要があります。
本来はこのMPG端子にマイコン式の専用MPGかロータリースイッチを使ったスタンダードタイプのMPGを使いますが、
X,Y,Z軸とステップパルスの倍率をロータリースイッチで切り替えるのが使い難いので、Arduino Pro Miniを使って
デジタル式に置き換えました。
ProMini用ソースファイル
EC300_MPG_Arduino Pro Mini_Saucefile.html (左のURLをクリックすると開きます)。


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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!


テーマ : 工作の作品
ジャンル : 写真

EC300モーションコントローラー対応にMPGを改造、その2

やはり、スタンダードタイプのMPGは使い難い!
EC300用にMPGをロータリースイッチを使ってXYZ3軸とスッテプパルスの倍率を切り替えるスタンダードタイプにしたが、
やはり、使い難いのでマイコンArduino Pro Miniを使ってボタンスイッチで切り替えるように変更しました。
時代ですね!マイコンの方がロータリースイッチよりも価格が安い!
また、手元用HIDキーボードとMPGの両方使うのが面倒なので以前のようにHIDキーボードを内蔵型としました。
折角作った手元用HIDキーボードなのでワークテーブルの横に固定して使うことにしました。

操作部をロータリースイッチからボタンスイッチに変更
左側:Mach3用HIDキーボード、右側がボタンスイッチに変更したMPGでHIDキーボードを内蔵しました。
EC300_MPG1.jpg

操作部の拡大画像 (文字はVビットで0.5㎜掘り込み赤と青のペイント仕上げです)。
右上3つのボタンが左からX、Y、Z 3軸の切り替えとSHIFTボタンを押すとx1,x10,x100のスッテプ倍率を切り替えます。
同じボタンで2通りの操作が出来ます。また、上側の青色LEDがX、Y、Zと赤色LEDがx1,x10,x100のインジケーターです。
その他のボタンスイッチがHIDキーボードでパソコンのUSBキーボードと同じ役目をし、必要な操作が手元で行えます。
EC300_MPG2.jpg

回路図 (画像をクリックすると拡大画像を別画面に表示します)。
使用中のパラレル入力装置に手を加えず、パソコンのパラレルポートの代わりとしてモーションコントローラーを使うことが
元々の発想です。
回路図左側がEC300の端子盤、その下側がMPG用コネクター端子、上中央が以前から使ってるMach3用パラレル入力
コントローラーHY-TBDVのパラレル入力コネクターの端子です。
右上がArduino Pro Microを使ったHIDキーボードの回路です。
右下がArduino Pro Miniも使ったMPGのX、Y、Z3軸とステップ倍率をボタンスイッチで切り替えとLED表示を行う回路です。
EC300の入力系が24V仕様なので切り替え部にフォトカプラを使って5V系と分離しました。
EC300_MPG_Circuit1.gif


次回は今回使ったマイコンのソースファイルを掲載予定です。


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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

Mach3用モーションコントローラーEC300にMGPを取り付ける。

EC300は問題なくパラレルポートの代役として完動しています。
3年前に作ったMPG(Manual Pulse Generator)が使い勝手が良いのでそのまま使えないかと試みましたが、
EC300のプラグインを使う関係でMach3へロータリーエンコーダーのDataが渡せませんでした。
仕方なくEC300のMPGコネクターにStandard MPGとして使えるように改造しました。

こちらが以前に作ったMach3用ハイブリッドMPGです。
HID(HumanInterfaceDevice)にArduino Pro Microを使ったキーボードを備え、PCのキーボードを触らなくても
Mach3を動かすのに必要な操作が、手元で行える便利な機能付きMPGです。
私のホームページ「CNCパラダイス」No.44:Mach3用 MPG(手動パルスジェネレータ)の製作を参照してください。
tepa_12.jpg

EC300用に使えるようStandardタイプMPGに改造
画像右側がキーボード部分を切り取り、黒いアクリル板にロータリースイッチとE-Stopボタンを設けたStandard MPGです。
画像左側は、後述のHIDキーボードで、上画像のキーボード部と同じ働きをします。
MGP4_1.jpg

EC300用Standard MPGの回路図
EC300_MPG.gif

HIDキーボードの製作
やはり、手元で操作が出来ないと不便なので新たにジャンクのスイッチを使ってHIDキーボードを作りました。
ケースは5mm厚アクリル板3枚を、CNCでポケット加工して作りました。
MGP4_2.jpg

HIDキーボードの回路図
HID_keyboard.gif

Arduino Pro Microのソースファイル

#include "Keyboard.h"
int TAB = 10;
int SHIFT = 16;
int Cycle_Start = 15;
int Reset = 19;
int Jog_Mode = 14;
int Cycle_Jog_Step = 6;
int Slow_Jog_UP = 5;
int Slow_Jog_DN = 4;
int Zero_X = 9;
int Zero_Y = 8;
int Zero_Z = 7;
int X_UP = 20;
int X_DN = 2;
int Y_UP = 3;
int Y_DN = 21;
int Z_UP = 1;
int Z_DN = 0;
int STOP = 18;

void setup() {
Keyboard.begin();
pinMode(TAB, INPUT_PULLUP);
pinMode(SHIFT, INPUT_PULLUP);
pinMode(Cycle_Start, INPUT_PULLUP);
pinMode(Reset, INPUT_PULLUP);
pinMode(Jog_Mode, INPUT_PULLUP);
pinMode(Cycle_Jog_Step, INPUT_PULLUP);
pinMode(Slow_Jog_UP, INPUT_PULLUP);
pinMode(Slow_Jog_DN, INPUT_PULLUP);
pinMode(Zero_X, INPUT_PULLUP);
pinMode(Zero_Y, INPUT_PULLUP);
pinMode(Zero_Z, INPUT_PULLUP);
pinMode(X_UP, INPUT_PULLUP);
pinMode(X_DN, INPUT_PULLUP);
pinMode(Y_UP, INPUT_PULLUP);
pinMode(Y_DN, INPUT_PULLUP);
pinMode(Z_UP, INPUT_PULLUP);
pinMode(Z_DN, INPUT_PULLUP);
pinMode(STOP, INPUT_PULLUP);
}

void loop() {
TAB = digitalRead(10);
SHIFT = digitalRead(16);
Cycle_Start = digitalRead(15);
Reset = digitalRead(19);
Jog_Mode = digitalRead(14);
Cycle_Jog_Step = digitalRead(6);
Slow_Jog_UP = digitalRead(5);
Slow_Jog_DN = digitalRead(4);
Zero_X = digitalRead(9);
Zero_Y = digitalRead(8);
Zero_Z = digitalRead(7);
X_UP = digitalRead(2);
X_DN = digitalRead(20);
Y_UP = digitalRead(3);
Y_DN = digitalRead(21);
Z_UP = digitalRead(1);
Z_DN = digitalRead(0);
STOP = digitalRead(18);

if (TAB == LOW) { // TAB-KEY
Keyboard.press(KEY_TAB);
delay(100);
Keyboard.releaseAll();
delay(200);
}
if (Cycle_Start == LOW) { // Cycle_Start
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('r');
delay(100);
Keyboard.releaseAll();
delay(100);
}
if (Reset == LOW) { // RESET
Keyboard.press('[');//何故か'['入力で'@'を出力(@が目的なのに文字化け)
delay(100);
Keyboard.releaseAll();
delay(200);
}
if (Cycle_Jog_Step == LOW) { // Cycle_Jog_Step
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('t');
delay(100);
Keyboard.releaseAll();
delay(200);
}
if (Jog_Mode == LOW) { // Jog_Mode
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('m');
delay(100);
Keyboard.releaseAll();
delay(200);
}
if (Slow_Jog_UP == LOW) { // Slow_Jog_UP
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('u');
delay(100);
Keyboard.releaseAll();
delay(200);
}
if (Slow_Jog_DN == LOW) {
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('d');
delay(100);
Keyboard.releaseAll();
delay(200);
}
if (Zero_X == LOW) { // Select X-axis for MPG 1/Zero-X-axis
if (SHIFT == LOW) { // Zero_X-axis
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('x');
delay(100);
Keyboard.releaseAll();
delay(200);
}
}
if (Zero_Y == LOW) { // Select Y-axis for MPG 1/Zero_Y-axis
if (SHIFT == LOW) { // Zero_Y-axis
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('y');
delay(100);
Keyboard.releaseAll();
delay(200);
}
}
if (Zero_Z == LOW) { // Select Z-axis for MPG 1/Zero_Z-axis
if (SHIFT == LOW) { // Zero_Z-axis
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('z');
delay(100);
Keyboard.releaseAll();
delay(200);
}
}
if (X_UP == LOW) { // X-axis Right
Keyboard.press(KEY_RIGHT_ARROW);
delay(300);//delay(100~300)
Keyboard.release(KEY_RIGHT_ARROW);
delay(1);
}
if (X_DN == LOW) { // X-axis Left
Keyboard.press(KEY_LEFT_ARROW);
delay(300);//delay(100~300)
Keyboard.release(KEY_LEFT_ARROW);
delay(1);
}
if (Y_UP == LOW) { // Y-axis Forward
Keyboard.press(KEY_UP_ARROW);
delay(300);//delay(100~300)
Keyboard.release(KEY_UP_ARROW);
delay(1);
}
if (Y_DN == LOW) { // Y-axis BackForward
Keyboard.press(KEY_DOWN_ARROW);
delay(300);//delay(100~300)
Keyboard.release(KEY_DOWN_ARROW);
delay(1);
}
if (Z_UP == LOW) { // Z-axis UP
Keyboard.press(KEY_PAGE_UP);
delay(300);//delay(100~300)
Keyboard.release(KEY_PAGE_UP);
delay(1);
}
if (Z_DN == LOW) { // Z-axis Down
Keyboard.press(KEY_PAGE_DOWN);
delay(300);
Keyboard.releaseAll();
delay(1);
}
if (STOP == LOW) { // STOP/ Goto Zero
if (SHIFT == LOW) { // Goto Zero
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_ALT);
}
else { // STOP
Keyboard.press(KEY_LEFT_ALT);
}
Keyboard.press('s');
delay(100);
Keyboard.releaseAll();
delay(200);
}
}



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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

イーサーネット接続CNCコントローラーEC300をパラレルインターフェースとして使う。

EC300をパラレルインターフェースとして使ったテスト結果
CNCコントロールソフトMach3ではWindows64bit機のパラレルポートがサポートされていません。
このため、後付けのパラレルポートを増設しても機能しないので、パラレルポートがサポートされたMach4(使い難い)
を使うしか方法がありません。 私は、使い慣れたMach3を使うために、USB又はイーサーネット接続のモーション
コントローラーを利用する方法を選びました。

EC300をパラレルインターフェースとしての製作例
手前側の24VDC電源は在り合わせを使ったのでオーバースペック(デカ過ぎる)です。マニュアルではシステムと
I/Oが別電源になっていますが、単電源でテストをしたところ影響がないので途中から単電源で使うことにしました。
D-SUB25Pinコネクターは、現用のパラレル接続コントローラーHY-TB4DV-4Axisに接続します。
EC300_Controller.jpg

拡大画像
パラレル接続コントローラーの入出力は全てTTLレベルなのでEC300の入出力もTTLレベルに合わせています。
EC300では、入力端子INと-COMを短絡するとスイッチが働きますが、IN1からIN12には24Vが印加されています。
ここでは、現用コントローラーからの信号がTTLレベルなのでフォトカプラーを使ってレベル変換を行っています。
IN01にはE-Stop信号、IN02にはProbe信号を割り当てました。
EC300右側のD-SUB9Pinコネクターは出力用です。ここでは、2番ピンにスピンドルモーターのON-OFF信号と
3番ピンにステッピングモータードライブ回路のイネーブル信号として割り当てました。
EC300_Controller_2.jpg

下の画像が現用のパラレル入力コントローラーHY-TB4DV-4Asxs
この部分は何も変更せず、EC300からのパラレルケーブルを繋ぐだけです。
CNC_4Axis1.jpg

配線図
ここでは、現用の4軸コントロールボードHY-TB4DV-4Asxsに手を加えず、パラレルケーブルを繋ぐだけで使えるように
配線しました。また、HY-TB4DV-4Asxsには、ホームスイッチ、リミットスイッチ、E-Stopスイッチ、Probeなどの入出力
スイッチ類が繋がっているのでパラレルケーブルを差し込めば全て機能する状態です。
コントローラーが他の機種の場合、パラレルポートのピンアサインが異なるので、機種に合わせた変更が必要です。
各軸単体のステッピングモータードライバーを使用の場合は直接EC300に接続して使ってください。
EC300_connection.gif


因みに、今回使用のEC300は先月アマゾンにて5千円余しで購入したが、今日は何と17999円に値上がりしてた!。
以前、半導体レーザーカッターにて紹介しました千円余しのUSB接続コントローラー「RnR」も同様に使えると思います。


私と同様に古いPCが壊れてどうしようかと悩んでいる方が多いと思います。
少しでも参考になれば幸いです。



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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

CNC用のパソコンがOUTに!

イーサーネット接続のモーションコントローラーEC300を試す。
約8年前に自作したCNCフライス盤を古いパソコンとコントロールソフトMach3を使ってコントロールしてましたが、
肝心のパソコンが壊れてしまいました。これまでに3台の中古PCを買いつないできましたが、この際パラレルポートを
諦めてモーションコントロールボードを使うことにしました。

私はイーサーネット接続タイプを購入しましたが、これから購入される方はUSB接続タイプをお勧めします。
その理由は、最近のノートパソコンにはイーサーネット端子が無いものが多い事と、EC300の場合は
コントロール用電源とIO用電源の2系統が必要でその分コストが掛かります。

イーサーネット入力のコントロールボード(EC300)
EC300.jpg

現用のパラレル入力コントロールボードを生かす。
新しいボードにステッピングモータードライブユニットを接続すれば簡単なのですが、現用のコントロールボードを
生かすために、パラレル入力にEC300の出力を少し加工して繋ぐ方法を採用することにしました。

現用のパラレル入力コントロールボード(HY-TBDV-4M)
CNC_4Axis1.jpg

これから改造作業に数週間掛かると思いますが、順次作業結果をまとめ、使い慣れたコントロールソフトMach3を
生かすための方法を紹介したいと思います。


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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

テーマ : DIY
ジャンル : 趣味・実用

ラズベリーパイで遊ぶ その4 気温・湿度・気圧センサーを繋ぐ ④

ソースコードの概要
BME280センサーからBMP280.pyにより取得した気温、湿度、気圧データをBlynkアプリへ出力及び16文字2行のLCDに
出力するPythonコードです。スマホにBlynkアプリをインストールしてLCD表示器をI2C接続してることを前提とします。
また、以下のlibraryを同じフォルダーに収めるかパスを通します。

各ライブラリーのダウンロード
ここに利用させて頂いたBMP280.pyはbme280_sample.pyに少し手を加えたコードで「ArduinoやESP、Raspberryで遊ぼう」
さんの記事から引用しました。ページを開いた一番下側のBMP280モジュール (bmp280.py)をコピーさせて頂きました。感謝!
BMP280.pyのコピー先URL

GitHubからI2C_LCD_driver.pyを取得します。
I2C_LCD_driver.pyのダウンロード先URL

GitHubからBlynkLib.pyを取得します。
BlynkLib.pyのダウンロード先URL

Blynk_BME280.py
import BlynkLib
import time
from BMP280 import get_BMP280_data, setup_BMP280
import threading
import smbus
import I2C_LCD_driver
from datetime import datetime

BLYNK_AUTH = 'lo*********************Xz' # BlynkアプリからTOKEN記号を取得
blynk = BlynkLib.Blynk(BLYNK_AUTH)
setup_BMP280()
mylcd = I2C_LCD_driver.lcd()

@blynk.VIRTUAL_WRITE(0)
def sensorDataSend():
time = datetime.now().strftime('%Y.%m.%d %I:%M') # 年月日と時刻を取得
t, p, h = get_BMP280_data() # BMP280.pyにより取得した気温、湿度、気圧データ
blynk.virtual_write(0,'気温%.1f ℃, 湿度%.1f %,気圧%.1f hPa' % (t, h, p)) # スマホBlynkアプリValue Displayへ出力
#print('気温 %.2f, 湿度 %.2f, 気圧 %.2f' % (t, h, p)) # print output to Shell
mylcd.lcd_display_string(time,1,0) # LCD1行目に年月日と時刻を出力
mylcd.lcd_display_string('T%.1f,H%.0f,P%.0f' % (t, h, p),2,0) # LCD2行目に気温、湿度、気圧を出力
t=threading.Timer(5, sensorDataSend) # 5秒毎にデータを送る
t.start()
return

t=threading.Timer(5, sensorDataSend)
t.start()

blynk.run()

Raspi Zero WHにセットの自作便利HATを介してI2C接続したBME280からのデータをLCDとスマホに配信しています。
スマホにはBlynkからネット経由にてデータが送られるのでインターネットが届く所なら何処でも受信できます。
今回はスマホへの単なるデータ表示のみですが、Blynkアプリの応用次第で受信したデータを元にスマホからラズパイを
コントロールするなど実用的な操作が簡単に行えます。
Blynk_280_1.jpg


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


良かったらclickしてください!
にほんブログ村 ハンドメイドブログへ
良かったらclickしてください!

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

プロフィール

CNC_Paradise

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

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

この人とブロともになる

QRコード
QR