Arduino Tips †更新日2022-10-13 (木) 09:22:17
作成日:2022年10月5日
インストール直後の設定画面で「OK」が押せない †Arduinoインストール後、File→Preferencesで「OK」ボタンが、グレーアウトしている。有効にするには一番上の「Skechbook location」の「BROESE」ボタンを押して設定すると「OK」ボタンが押せるようになる。 シリアルデータの受信 †デバッグ等でArduino IDEのシリアルモニタからデータを送信するようなときに使用する。
サンプル †
//シリアルモニタから送信されたデータを受信してシリアルモニタに表示 // 例)3:1500 //受信データ格納配列 int data1[3] = {0, 0, 0}; int data2[3] = {0, 0, 0}; void reive_data(){ int in_data; if ( Serial.available() > 0){//入力がはいればを処理 delay(10); //データを全て受信するまで待つ(値は適当) in_data = Serial.parseInt(); data1[0] = in_data; char delimiter = Serial.read(); in_data = Serial.parseInt(); //デリミタをチェックすることで、「送信」ボタンやEnterだけ押された //とき無視する。正常データの場合も最後に「LF」が入り、ルーチンが2回 //周り「LF」のみの処理を行うので困る if (delimiter == ':'){//デリミタが「:」なら処理 data1[1] = in_data; //行末の「送信」ボタンまたはEnter入力時の「LF」を読み込んで捨てる char dummy = Serial.read(); Serial.print(data1[0]); Serial.print( delimiter ); Serial.print(delimiter, DEC); Serial.print( "====>"); Serial.println(data1[1]); } } } void setup() { // put your setup code here, to run once: Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: reive_data(); } 実行結果 †
多相のパルス生成 †サーボモータを複数使用するためなどに利用できそうな多相パルスを作成。 プログラム †
ソース †
// 多相パルス発生プログラム // 8相PIN5-12 // #define CH0_PIN 5 #define CH1_PIN 6 #define CH2_PIN 7 #define CH3_PIN 8 #define CH4_PIN 9 #define CH5_PIN 10 #define CH6_PIN 11 #define CH7_PIN 12 //シリアルからパルス幅の設定チャンネル int sel_ch; //0-7 //パルス幅(us) int pw[] = {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}; //1ms int in_data1; int in_data2; //PWM作成 void mk_pwm(){ //20ms周期に入るとき全てのチャンネルをHighにする digitalWrite( CH0_PIN, HIGH ); digitalWrite( CH1_PIN, HIGH ); digitalWrite( CH2_PIN, HIGH ); digitalWrite( CH3_PIN, HIGH ); digitalWrite( CH4_PIN, HIGH ); digitalWrite( CH5_PIN, HIGH ); digitalWrite( CH6_PIN, HIGH ); digitalWrite( CH7_PIN, HIGH ); int i = 0; while ( i < 1920){ // シリアルチェックで分を引く delayMicroseconds( 7 ); //全体で10usになるように設定 int j = i * 10; if (pw[0] == j){ digitalWrite( CH0_PIN, LOW ); } if (pw[1] == j){ digitalWrite( CH1_PIN, LOW ); } if (pw[2] == j){ digitalWrite( CH2_PIN, LOW ); } if (pw[3] == j){ digitalWrite( CH3_PIN, LOW ); } if (pw[4] == j){ digitalWrite( CH4_PIN, LOW ); } if (pw[5] == j){ digitalWrite( CH5_PIN, LOW ); } if (pw[6] == j){ digitalWrite( CH6_PIN, LOW ); } if (pw[7] == j){ digitalWrite( CH7_PIN, LOW ); } i++; } } //シリアルポートからパルス幅をusで入力 (例 ch1:800) //PWMの周期はこの命令のロス分を考慮 int serialReadAsPw() { if ( Serial.available() > 0){ delay(10); //データを全て受信するまで待つ(値は適当) in_data1 = Serial.parseInt(); char delimiter = Serial.read(); in_data2 = Serial.parseInt(); if (delimiter == ':'){//デリミタが「:」なら処理 pw[in_data1] = in_data2; } } } void setup() { // put your setup code here, to run once: Serial.begin( 9600); pinMode( CH0_PIN, OUTPUT ); pinMode( CH1_PIN, OUTPUT ); pinMode( CH2_PIN, OUTPUT ); pinMode( CH3_PIN, OUTPUT ); pinMode( CH4_PIN, OUTPUT ); pinMode( CH5_PIN, OUTPUT ); pinMode( CH6_PIN, OUTPUT ); pinMode( CH7_PIN, OUTPUT ); } void loop() { // put your main code here, to run repeatedly: serialReadAsPw(); mk_pwm(); } 実行結果 †−ロジックアナライザの出力
|