工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

鉄道模型デジタルDCCコマンドステーションArduinoと無料アプリ

コンポーネントと消耗品

>
SparkFun Arduino Pro Mini 328-5V / 16MHz
× 1
LMD18200t
× 1
PCB
× 1
リニアレギュレータ(7805)
× 1
3.6V0.5Wツェナーダイオード
× 1
コンデンサ220µF
16ボルト
× 1
コンデンサ10µF
16ボルト
× 1
セラミックディスクコンデンサ、0.1 µF
× 3
抵抗10kオーム
× 2
スルーホール抵抗、4.7 kohm
× 1
ネジ留め式端子2の位置3.5mmの中心、1.1mmのピン径
× 1
ネジ留め式端子6の位置2.54mmの中心
× 1
4ピン2.54mmソケット
× 1
12ピン2.54mmソケット
× 2

アプリとオンラインサービス

LocoMotive
これはアプリの無料バージョンです
LocoMotive DCC
これは、cv1から255の読み取り/書き込みを含む最新バージョンです

このプロジェクトについて

このシステムの違いは何ですか?
非常にシンプルな電子回路がトラックにDCC信号と電力を供給しますが、アプリが実際に機能します! 各命令パケットを形成するために必要なコードを作成することで、携帯電話のコンピューターを最大限に活用し、Arduinoコントローラーの作業を簡素化します!

2019年8月16日更新:新しく改良されたアプリのリリース-CV1から255の読み取り/書き込み機能付き
このアプリのバージョン 5ポンドと税金がかかり、GooglePlayストアで購入できます。

<図> <図> <図> <図> <図>

2019年5月18日更新:新しく改善されたアプリのリリース-編集可能なタイトル、可視性、一時的なオプションを備えた最大28の機能。画面上のスピードバーで一度に最大4つのロコを制御します。このアプリのバージョン 3ポンドと税金がかかり、GooglePlayストアで購入できます。

更新2019年2月17日:受信範囲を拡張するためにHC-06 Bluetoothモジュールを変更する必要がある場合があります。長さ31.2 mm(1/4の2.4 GHzの波長)。手順2の添付写真をご覧ください。

更新2019年1月29日:ホーンサウンドのF2およびF3にモーメンタリオプションを追加各ロコのプリセット最大速度これは、構築可能な最も効率的なDCCコマンドステーションです。他のシステムは、これほど少ないコンポーネントでこれほど多くのことを行うことはできません.eBayで利用可能なPCBを備えた完全に機能するDCCコマンドステーションを簡単に組み立てることができ、必要な部品はわずかです。アプリ「LocoMotive」は、バージョン4.1以降を実行しているAndroid携帯で動作するように設計されています。 適切なシステムを購入する必要はありません。これは、「LocoMotive」と呼ばれる無料アプリによって操作されるスタンドアロンユニットであり、NMRA準拠のデコーダーで動作します。このシステムは、Arduinoインターフェースに送信されるアプリ内の動作中のDCCパケットをコンパイルして、DCCクロック信号と結合します。このPCBをeBayで購入します。GooglePlayストアで無料のAppLocoMotiveを入手します。機能は次のとおりです。

  • 1〜20個のロコの制御
  • 中小規模のレイアウトに最適
  • 2アンペアの負荷は、指定されたHブリッジを使用して最大16台のOO / HO機関車を駆動します
  • より高い電流互換のhブリッジを追加して、負荷容量を拡張します
  • 短絡保護
  • 自動過電流カットアウト、Arduinoコードで調整可能
  • 光と方向
  • 機能1〜8
  • 関数名、可視性、瞬間的なアクションを編集する
  • 投票率/ポイント/アクセサリは最大8ペアの出力で動作します
  • 投票率の名前を編集する
  • ロコのカスタム命名とそれぞれの最大速度の設定
  • CV1ロコアドレスのプログラミング
  • CV 1〜255の読み取り/書き込み
  • 独自のアクセサリアドレスを追加する
  • 使用するスケール(Z / N / OO / HO / O / G)12v〜20vに合わせてDC電源を選択してください

DCCワイヤレスシステムに関する以前の作業に加えて、HC-06BTモジュールと2アンペアを供給するLMD18200Hブリッジモータードライバーを備えたレシーバーArduinoベースの回路にリンクされたBluetoothコマンドステーションを開発しました。

部品の全体的なコストは、eBayから購入した部品で約£20です。

ステップ1:Arduinoスケッチ

完全なスケッチが添付されています。この部分は、ループとデータレシーバーのコードです。 Androidアプリは完全なパケットを受信者に送信し、ここでデータの配列にデコードされます。 3バイトと4バイトのどちらを受信したかに応じて、コードは線路の正しいDCCパケット形式を生成します。

void loop(){if(bluetooth.available()> 0); {inString =bluetooth.readStringUntil( '\ n');} if(inString.substring(0、1)=="D"){string();} delay(20);}

次に、string()voidは、受信したテキスト文字列からデータを分割し、各命令をDCCパケット内の適切な位置に配置します。

例:

受信した「DD、3、63、12、48、」のテキスト文字列は、それぞれ8ビットの4バイトの速度パケットに変換されます:

DD =メッセージIDByte:[1] [2] [3] [4] 10進数:[3] [63] [12] [48] 2進数:[0000 0011] [0001 1111] [0000 1100] [00011000]アクション:[ロコ3] [速度ステップ] [ロコ速度] [XORデータチェック]

受信した「DD、1、129、128、」のテキスト文字列は、各8ビットの3バイト関数パケットに変換されます。10進数:[1] [129] [128] 2進数:[0000 0001] [1000 0001] [1000 0000]アクション:[Loco 1] [F1 on] [XOR data check]

NMRAパケット標準の詳細については、https://www.nmra.org/sites/default/files/s-9.2.1_2 ...

を参照してください。 s-9.2.1_2012_07.pdf

LMDでは、DIRピンにDCC信号が必要であり、PWMピンはHIGHに保持されている必要があります。

command_station_bluetooth_oct_2018.ino

ステップ2:フリッツ回路図

Arduino Pro Miniは、HC​​-06モジュールを介してBluetoothデータを受信します。 Arduinoは、データのNMRA標準クロックサイクルをパケット形式で生成します。受信したデータは、新しいデータが受信され、DCCパケットが更新されて線路に命令を送信すると、シーケンスを中断します。

必要な部品のリスト:

PCBはeBayで入手できます。

1オフArduinoPro Mini Atmega328P 5V / 16M eBay

1オフLMD18200THブリッジeBay

1オフHC-06BluetoothモジュールeBay

1オフ0.1オーム2W金属皮膜抵抗器0.1R2ワット(11.5 mm x 4.5 mm)eBay

3オフコンデンサ0.1ufeBay

2オフ10kΩ抵抗eBay

1個のコンデンサ10uf25v; eBay

1個のコンデンサ220uf16v; eBay

1オフPhoenixContact MKDS 1 / 2-3、52ウェイスクリューPCB端子台13.5A200V 3.5mm eBay

1オフ4.7kΩ抵抗eBay

1オフL7805CV正電圧レギュレータICeBay

1オフ4ピンメスヘッダーエッジピンストリップ0.1 "2.54mm eBay

2オフ12ピンメスヘッダーエッジピンストリップ0.1 "2.54mm eBay

1オフ6ピン2.54mmPCBユニバーサルネジ留め式端子台eBay

1オフツェナーダイオード3.6V; 0.5W 1N4732A eBay

ワイヤー

電源装置:OO / HOレイアウトの場合は、14V DC電源装置(eBayのラップトップ充電器ユニットなど)を使用します。たとえば、これは最大2.5アンペアを供給します。このプロジェクト用に選択した電源装置にDCジャックプラグを取り付けるために必要なパネル取り付けソケットのサイズを確認してください。 https://www.ebay.co.uk/itm/Samsung-AC-DC-Adapter -...

HC-06 Btモジュールの範囲を拡張するには、モジュールのアンテナの端にワイヤーをはんだ付けします。長さ31.2mm(2.4 GHzの波長の1/4)の単線銅線(主アース線から)を使用しました。上の写真を参照してください。注意してください-HC-06接続はRx(PCB上)からRx(モジュール上)およびTxからTxです。他のコンポーネントとの偶発的な短絡を避けるために、アンテナ線はスリーブで覆われている必要があることに注意してください。

LMD18200 hブリッジモジュール(上に表示されているように、これはヒートシンクなどを備えたモジュール形式です)を使用するために、電流検出コンポーネントを追加して、線路の短絡または過負荷の問題から保護します。更新された回路図とArduinoコードに現在のセンス機能が含まれるようになりました。

コードは、到達時に最大電流を2アンペアに制限し、LMD18200 hブリッジは、ArduinoのD13からhブリッジの「ブレーキ」入力にHIGH信号を印加することによってシャットダウンされます。

0.1オームの電流検出抵抗を使用すると、最大2アンペアの負荷に対してArduinoセンサーピンA0で0〜200mvのアナログ入力範囲が得られます。アナログステップ入力あたり約5mv(合計1023ステップまたはディビジョン)の場合、0〜40ディビジョンまたは2アンペア/ 40 =50mA /ディビジョンになります。測定された電流精度は50mAですが、2アンペアに達したときにhブリッジを保護しています。 LMD18200には、バックアップとして過熱保護機能も組み込まれています。if(C> 2000){// 2アンペア

Serial.println( "過電流"); digitalWrite(13、HIGH); }

引き出された電流の値は、Bluetooth経由で毎秒Androidアプリに送信されます。voidsend_c(){t =millis()-lastmillis; if(t> =間隔){bluetooth.write(sensorValue); bluetooth.write( 'c'); lastmillis =millis(); }}

ステップ3:Androidアプリ

GooglePlayストアから無料アプリをダウンロード-'LocoMotive '

Google Playストアからアプリ全体(£5.99)をダウンロード-'LocoMotive DCC '

フルバージョンのアプリの手順が添付されています。

コード

  • locomotive_dcc_sep19.ino
locomotive_dcc_sep19.ino Arduino
Arduinoコード
 // 2019年9月1日// LMD18200h-bridgeを使用したAndroidアプリ「LocomotiveDCC」で使用するスケッチ// CV読み取り/書き込み機能が追加されました#include  SoftwareSerial bluetooth(8,9); // RX TXint C; int SensorValue; long t =0; long lastmillis =0; long interval =1000; String inString; int a [8]; int preamable_type =0; int Address; float CV_VAL; float cv_val; float cv_val0; float cv_val1; float cv_val2; float cv_val3; float cv_val4; float cv_val5; float cv_val6; float cv_val7; int test_num; int cv_write_val; int Cs; boolean cv_logic; boolean ok; int num; / //タイマー周波数は2MHz(16MHzから/ 8プリスケール)#define TIMER_SHORT 0x8D // 58usecパルス長#defineTIMER_LONG 0x1B // 116usecパルス長unsignedchar last_timer =TIMER_SHORT; //最後のタイマー値を格納しますunsignedchar flag =0; //短いまたは長いpulseunsignedcharに使用every_second_isr =0; //パルスアップまたはダウン//ステートマシンの定義#definePREAMBLE 0 #define SEPERATOR 1#define SENDBYTE 2unsigned char state =PREAMBLE; unsigned char preamble_count =16; unsigned char outbyte =0; unsigned char cbit =0x80; // variableunsigned char xdata =0、data =0、data_f =0、data_f1 =0、data_f2 =0; int locoAdr =9; //これはlocoのデフォルトアドレスです// commandstructのバッファMessage {unsigned char data [7]; unsigned char len;}; #define MAXMSG 3 //当面は、アイドルメッセージ、ロコスピードメッセージ、関数msgstructメッセージメッセージmsg [MAXMSG] ={{{0xFF、0、0xFF、0、 0、0、0}、3}、//アイドルメッセージ{{locoAdr、0、0、0、0、0、0}、3} // 128スピードステップのlocoMsg0x3f}; // loco msgは、後で速度とXORデータバイトで埋める必要がありますint msgIndex =0; int byteIndex =0; // Setup Timer2 .//8ビットTimer2を設定して、指定された周波数で割り込みを生成します。//ISRルーチン内でTCNT2にロードする必要のある時間ロード値を返します。voidSetupTimer2(){ // Timer2設定:タイマープリスケーラー/ 8、モード0 //ティマークロック=16MHz / 8 =2MHzまたは0,5usecTCCR2A =0; TCCR2B =0 < =MAXMSG){msgIndex =0; } byteIndex =0; //バイト0でメッセージを開始} break;ケースSEPERATOR:flag =0; //長いパルス//次に次の状態に進みますstate =SENDBYTE; //次のバイトに移動... cbit =0x80; //次回最初にこのビットを送信しますoutbyte =msg [msgIndex] .data [byteIndex];壊す;ケースSENDBYTE:if(outbyte&cbit){フラグ=1; //短いパルスを送信します} else {flag =0; //長いパルスを送信します} cbit =cbit>> 1; if(cbit ==0){//最後に送信されたビット、次のバイトはありますか? byteIndex ++; if(byteIndex> =msg [msgIndex] .len){//これはすでにXORバイトであり、プリアンブル状態に進みます=PREAMBLE; if(preamable_type ==0){preamble_count =16; //通常のプリアンブルの長さ16'1's} if(preamable_type ==1){preamble_count =24; // CV1書き込み用の24個の '1のプリアンブル}} else {// separtorを送信し、次のバイト状態に進みます=SEPERATOR; } } 壊す; } if(flag){// data ==1の場合、短いパルス遅延=TCNT2; TCNT2 =レイテンシ+ TIMER_SHORT; last_timer =TIMER_SHORT; } else {//長いパルスレイテンシ=TCNT2; TCNT2 =レイテンシ+ TIMER_LONG; last_timer =TIMER_LONG; }}} void setup(){Serial.begin(115200); analogReference(INTERNAL); pinMode(13、OUTPUT); bluetooth.begin(9600); delay(500); // bluetoothモジュールが開始するのを待ちますSerial.println( "Bluetooth Started"); bluetooth.println( "Bluetooth開始"); DRDD =B01100000; //デジタルピン5の場合はD5を登録します。//デジタルピン6の場合はD6を登録します。//タイマーを開始します。 //ブリッジをオフにしますo / p offint get_cv_val =cv_calc(test_num);} void current(){int i; int値=0; int numReadings =5; for(i =0; i  2000){// 2アンペアSerial.println( "Over Current"); bluetooth.println( "Short!"); digitalWrite(6、LOW); // DCC信号のロー(オフ)への論理制御digitalWrite(13、HIGH); //ブレーキをかけるには、hブリッジを短絡しますo / p bluetooth.println(C); }} void loop(){if(bluetooth.available()==true); {inString =bluetooth.readStringUntil( '\ n'); Serial.println(inString); } if(inString.substring(0,1)=="D"){string(); } //着信DCCパケットif(inString.substring(0,1)=="C"){digitalWrite(6、HIGH); digitalWrite(13、LOW); } //過電流後にリセット、DCC信号の論理制御をオン、ブレーキをオフif(inString.substring(0,1)=="G"){digitalWrite(6、HIGH); digitalWrite(13、LOW);現在(); bluetooth.println(C);} //ロード電流値の要求if(inString.substring(0,1)=="A"){digitalWrite(6、HIGH); digitalWrite(13、LOW); get_cv_data(); cv1_prog(); digitalWrite(6、LOW); digitalWrite(13、HIGH);} if(inString.substring(0,3)=="get"){cv_val =0; digitalWrite(6、HIGH); digitalWrite(13、LOW); get_cv_num(); cv_read(); digitalWrite(6、LOW); digitalWrite(13、HIGH); } if(inString.substring(0,3)=="add"){cv_write_val =0; digitalWrite(6、HIGH); digitalWrite(13、LOW); get_cv_new_val(); repeat_cv_write(); digitalWrite(6、LOW); digitalWrite(13、HIGH); } if(inString.substring(0,1)=="V"){delay(50); bluetooth.print( "CV1 updated"); Serial.println(Address);} // cv1 write if(inString.substring(0,1)=="E"){digitalWrite(6、LOW); // DCC信号のロー(オフ)への論理制御digitalWrite(13、HIGH); //ブレーキをかけ、h-bridge o / pをショートさせます} // e-stop inString =""; } void get_cv_new_val(){Serial.println(inString);文字列cv_w =""; int x =inString.indexOf( "new、")+ 4; cv_w =inString.substring(x、x + 3); Serial.println(cv_w); cv_write_val =cv_w.toInt(); Serial.print( "cv_write_val:"); Serial.println(cv_write_val); String addr =""; int z =inString.indexOf( "addr、")+ 5; addr =inString.substring(z、z + 1); Serial.println(addr);アドレス=addr.toInt(); Serial.print( "アドレス:"); Serial.println(アドレス); } void get_cv_num(){cv_write_val =0; Serial.println(inString); String temp =""; int x =inString.indexOf( "、")+ 1; temp =inString.substring(x、8); Serial.println(temp);アドレス=temp.toInt(); Serial.print( "アドレス:"); Serial.println(アドレス); } void get_cv_data(){unsigned long z =inString.length(); int y =0; int count =0;文字列inChar; String temp =""; for(int i =0; i <=z; i ++){inChar =inString.substring(i、i + 1); if(inChar =="、"){count ++;} if(inChar!="、" &&inChar!="A"){temp + =inChar;} if(inChar =="、"){アドレス=(temp .toInt()); y =y +1; temp ="";}} amend_len3(msg [1]); assemble_3_byte(); Serial.println(inString); } void string(){unsigned long z =inString.length(); int y =0; for(int i =0; i <=5; i ++){a [i] =0; } int count =0; String inChar; String temp =""; for(int i =0; i <=z; i ++){inChar =inString.substring(i、i + 1); if(inChar =="、"){count ++; } if(inChar!="、" &&inChar!="D"){temp + =inChar; } if(inChar =="、"){a [y] =(temp.toInt()); y =y +1; temp =""; }} if(count ==3){// Serial.println(inString); // print_data(); amend_len3(msg [1]); assemble_3_byte(); } if(count ==4){// Serial.println(inString); // print_data(); amend_len4(msg [1]); assemble_4_byte(); } //Serial.println(inString); //Serial.println(a[1]); // Serial.println(a [2]); //Serial.println(a[3]); //Serial.println(a[4]); // print_data(); } void amend_len4(struct Message&x){x.len =4; //Serial.println(x.len);} void assemble_4_byte(){preamable_type =0; // 16 x '1's noInterrupts(); msg [0] .data [0] =B11111111; msg [0] .data [1] =B00000000; msg [0] .data [2] =B11111111; msg [1] .data [0] =a [1]; msg [1] .data [1] =a [2]; msg [1] .data [2] =a [3]; msg [1] .data [3] =((a [1] ^ a [2])^ a [3]); Interrupts();} void amend_len3(struct Message&x){x.len =3; //Serial.println(x.len);} void assemble_3_byte(){preamable_type =0; // 16 x '1's noInterrupts(); msg [0] .data [0] =B11111111; msg [0] .data [1] =B00000000; msg [0] .data [2] =B11111111; msg [1] .data [0] =a [1]; msg [1] .data [1] =a [2]; msg [1] .data [2] =(a [1] ^ a [2]); msg [1] .data [3] =0;割り込み(); } void print_data(){Serial.print(msg [1] .data [0]、DEC); Serial.print( "、"); Serial.print(msg [1] .data [1]、DEC); Serial.print( "、"); Serial.print(msg [1] .data [2]、DEC); Serial.print( "、"); Serial.print(msg [1] .data [3]、DEC); Serial.println( "、"); } // CV readvoid cv_current(){for(int i =1; i <=10; i ++){sensorValue =analogRead(A0); C =10.8 * SensorValue; // mA if(C> =Cs){cv_logic =true; } delayMicroseconds(500); Serial.print( "C ="); Serial.println(C);}} void cv_read(){cv_val =0; delay(200);現在(); if(bluetooth.available()==true); {bluetooth.print( "reading .."); } Cs =C + 50; CV_VAL =99; for(int f =1; f <=10; f ++){if(CV_VAL ==99){cv_val0 =cv_calc(0); delay(10); }} CV_VAL =99; for(int f =1; f <=10; f ++){if(CV_VAL ==99){cv_val1 =cv_calc(1); delay(10); }} CV_VAL =99; for(int f =1; f <=10; f ++){if(CV_VAL ==99){cv_val2 =cv_calc(2); delay(10); }} CV_VAL =99; for(int f =1; f <=10; f ++){if(CV_VAL ==99){cv_val3 =cv_calc(3); delay(10); }} CV_VAL =99; for(int f =1; f <=10; f ++){if(CV_VAL ==99){cv_val4 =cv_calc(4); delay(10); }} CV_VAL =99; for(int f =1; f <=10; f ++){if(CV_VAL ==99){cv_val5 =cv_calc(5); delay(10); }} CV_VAL =99; for(int f =1; f <=10; f ++){if(CV_VAL ==99){cv_val6 =cv_calc(6); delay(10); }} CV_VAL =99; for(int f =1; f <=10; f ++){if(CV_VAL ==99){cv_val7 =cv_calc(7); delay(10); }} Serial.print( "cv_val0"); Serial.println(cv_val0); Serial.print( "cv_val1"); Serial.println(cv_val1); Serial.print( "cv_val2"); Serial.println(cv_val2); Serial.print( "cv_val3"); Serial.println(cv_val3); Serial.print( "cv_val4"); Serial.println(cv_val4); Serial.print( "cv_val5"); Serial.println(cv_val5); Serial.print( "cv_val6"); Serial.println(cv_val6); Serial.print( "cv_val7"); Serial.println(cv_val7); int cv_val_total =cv_val0 + cv_val1 + cv_val2 + cv_val3 + cv_val4 + cv_val5 + cv_val6 + cv_val7; cv_val =0; if(cv_val0 ==1){cv_val =cv_val + 1; } if(cv_val1 ==1){cv_val =cv_val + 2; } if(cv_val2 ==1){cv_val =cv_val + 4; } if(cv_val3 ==1){cv_val =cv_val + 8; } if(cv_val4 ==1){cv_val =cv_val + 16; } if(cv_val5 ==1){cv_val =cv_val + 32; } if(cv_val6 ==1){cv_val =cv_val + 64; } if(cv_val7 ==1){cv_val =cv_val + 128; } if(bluetooth.available()==true); {if(cv_val_total> 9){bluetooth.print( "read =error"); } if(cv_val_total <9){bluetooth.print( "read ="); bluetooth.println(int(cv_val + 0.5)); }} Serial.print( "cv_val"); Serial.println(int(cv_val + 0.5));} void cv1_prog(){for(int i =0; i <=3; i ++){reset_packet(); delay(5); } for(int i =0; i <=5; i ++){page_preset_packet(); delay(5); } for(int i =0; i <=9; i ++){reset_packet(); delay(5); } for(int i =0; i <=5; i ++){cv1_write_packet(); delay(5); } current(); for(int i =0; i <=10; i ++){cv1_write_packet(); delay(5); }} void reset_packet(){noInterrupts(); preamable_type =0; msg [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B00000000; msg [1] .data [1] =B00000000; msg [1] .data [2] =B00000000; Interrupts();} void page_preset_packet(){noInterrupts(); preamable_type =0; // 16 x'1のmsg [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B01111101; msg [1] .data [1] =B00000001; msg [1] .data [2] =B01111100; Interrupts();} void cv1_write_packet(){preamable_type =1; // 24 x '1's noInterrupts(); msg [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B01111000; //アドレスのみのモードmsg [1] .data [1] =B00000000 |住所; msg [1] .data [2] =(msg [1] .data [0] ^ msg [1] .data [1]); Interrupts();} void cv_verify1_packet(){noInterrupts(); preamable_type =1; // 24 x'1のmsg [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B01111000; //ビット操作モードmsg [1] .data [1] =B00000000 | (住所(1); msg [1] .data [2] =B11101000 | num; msg [1] .data [3] =(msg [1] .data [0] ^ msg [1] .data [1])^ msg [1] .data [2];割り込み(); } void cv_verify0_packet(){noInterrupts(); preamable_type =1; // 24 x'1のmsg [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B01111000; //ビット操作モードmsg [1] .data [1] =B00000000 | (住所(1); msg [1] .data [2] =B11100000 | num; msg [1] .data [3] =(msg [1] .data [0] ^ msg [1] .data [1])^ msg [1] .data [2];割り込み(); } void cv_write_packet(){preamable_type =1; // 24 x '1's noInterrupts(); msg [0] .data [0] =B11111111; msg [0] .data [1] =B11111111; msg [0] .data [2] =B11111111; msg [1] .data [0] =B01111100; //書き込みモードmsg [1] .data [1] =B00000000 | (住所(1); msg [1] .data [2] =B00000000 | cv_write_val; msg [1] .data [3] =(msg [1] .data [0] ^ msg [1] .data [1])^ msg [1] .data [2];割り込み(); } void valid_packet(){noInterrupts(); msg [0] .data [0] =B11111111; msg [0] .data [1] =B00000000; msg [0] .data [2] =B11111111; preamable_type =0; // 16 x'1のmsg [1] .data [0] =(アドレス-1); msg [1] .data [1] =0x80; //グループ1命令のlocoMsg0x80 msg [1] .data [2] =msg [1] .data [0] ^ msg [1] .data [1]; msg [1] .data [3] =0;割り込み();} // CV writevoid repeat_cv_write(){current(); Cs =C + 50; Serial.print( "C ="); Serial.println(C); Serial.print( "Cs ="); Serial.println(Cs); if(bluetooth.available()==true); {bluetooth.print( "writing .."); } ok =false; for(int f =1; f <=10; f ++){if(ok ==false){cv_write(); delay(10); }}} void cv_write(){delay(100); amend_len3(msg [1]); assemble_3_byte(); delay(5); for(int i =1; i <=20; i ++){valid_packet(); delay(5); } for(int i =1; i <=6; i ++){reset_packet(); delay(5); } cv_logic =false; amend_len4(msg [1]); assemble_4_byte(); for(int i =1; i <=10; i ++){cv_write_packet(); cv_current(); Serial.print( "C ="); Serial.println(C); if(cv_logic){ok =true; cv_logic =false; i =11; amend_len3(msg [1]); assemble_3_byte(); for(int i =1; i <=10; i ++){reset_packet(); delay(5); } if(bluetooth.available()==true); {bluetooth.print( "write ="); bluetooth.println(cv_write_val); Serial.print( "cv_write_val"); Serial.println(cv_write_val); }}} if(bluetooth.available()==true); {if(ok ==false){bluetooth.print( "write =error"); }}} int cv_calc(int test_num){amend_len3(msg [1]); assemble_3_byte(); delay(5); for(int i =1; i <=20; i ++){valid_packet(); delay(5); } num =test_num; amend_len3(msg [1]); assemble_3_byte(); for(int k =1; k <=4; k ++){reset_packet(); delay(5); } amend_len4(msg [1]); assemble_4_byte(); cv_logic =false; delay(2); for(int m =1; m <=5; m ++){cv_verify1_packet(); cv_current(); if(cv_logic){cv_logic =false; CV_VAL =1; Serial.print( "test_num ="); Serial.println(test_num); Serial.println(CV_VAL); preamable_type =0; amend_len3(msg [1]); assemble_3_byte(); delay(5); for(int j =1; j <=3; j ++){reset_packet(); delay(5); }}} Serial.println( "test for 0"); amend_len3(msg [1]); assemble_3_byte(); for(int k =1; k <=4; k ++){reset_packet(); delay(5); } amend_len4(msg [1]); assemble_4_byte(); cv_logic =false; delay(2); for(int m =1; m <=5; m ++){cv_verify0_packet(); cv_current(); if(cv_logic){cv_logic =false; CV_VAL =0; Serial.print( "test_num ="); Serial.println(test_num); Serial.println(CV_VAL); preamable_type =0; amend_len3(msg [1]); assemble_3_byte(); delay(5); for(int j =1; j <=3; j ++){reset_packet(); delay(5); }}} Serial.println(CV_VAL); return CV_VAL; } 

カスタムパーツとエンクロージャー

エンクロージャー内の完全な回路

回路図

Bluetoothレシーバー/ Hブリッジアンプ回路 bluetooth_android_dcc_lmd18200_S8NTVsI4LY.fzzAppの手順

製造プロセス

  1. MrRobot – Ubuntuモバイルアプリ対応のロボティクス(Raspberry Piとarduinoが関与)
  2. 6-シューター:Arduinoドリンクミキシングステーション
  3. Arduino Digital Dice
  4. Arduinoゲームコントローラー
  5. LCDアニメーションとゲーム
  6. スマートシューズ(自動レーシングおよび発電)
  7. arduinoを使用したソナーと処理IDEでの表示
  8. ピクセルチェイサーゲーム
  9. BoltとArduinoを使用したLEDの明るさの制御
  10. $ 10ポータブルArduinoウェザーステーション(AWS)
  11. Python3とArduinoコミュニケーション