🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

1回答

1987閲覧

ArduinoNANOプログラムをGR-CITRUSのRubyプログラムに転換したい

denko.today

総合スコア6

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2019/11/02 00:08

Arduino IDEで制作したArduino NANO用のプログラムをGR-CITRUSに書き込むRubyプログラムに変換したい

##これまでの経過とさせたいこと
制御をArduinoNANOマイコン、通信部分をNodeMCUマイコン、操作をスマホアプリのBLYNKを使用して無線ロボットを製作してきました。制御部分をArduinoNANOではなくRubyマイコンのGR-CITRUSに転換することになりました。
ArduinoNANOのプログラムとNode-MCUのプログラムは問題なく動作し、マイコン間はRTXピンでシリアル通信を、Node-MCUと無線機器とはWiFi環境下で動かしています。
このArduinoNANOマイコンをGR-CITRUSに転換し、同じ動作をさせることが目的です。Rubyプログラミングの経験が浅い中制作したプログラムはうまく動きませんでした。
###~要点~
・ArduinoNANOとNode-MCUはRTXピンでシリアル通信を行ってデータを送受信
・コントローラはBLYNKアプリを使用
・GR-CITRUSとNode-MCUもRTXピンでシリアル通信を行いたい。
・GR-CITRUSとNode-MCUのプログラムはエラーこそ出ないが動作しない
###開発環境
・ArduinoNANO、Node-MCUのプログラムはArduinoIDEで開発
・Node-MCUはスマホアプリケーションBLYNKを使ってWiFi環境下で操作
・GR-CITRUSのプログラムはRubicで開発
・ロボットは四輪駆動でディレクションとPWM制御でモータドライバを介して動かしています。
###発生している問題・エラーメッセージ
エラーメッセージすら出ないので何が問題かわからない。
RubicでGR-CITRUSへの書き込みは問題なくできます。
##該当のソースコード

ArduinoIDE

1//ArduinoNANOのプログラムです 2//扱うピンの設定と指定 3#define FENA 3 4#define FENB 5 5#define RENA 9 6#define RENB 11 7 8#define FIN1 4 9#define FIN2 33 10#define FIN3 6 11#define FIN4 37 12#define RIN1 10 13#define RIN2 25 14#define RIN3 12 15#define RIN4 29 16 17int PWM = 70 , Pwm1 = 95 , Pwm2 = 105 , Pwm3 = 95 , Pwm4 = 105 ; //PWMの初期設定 18char mode = 1; 19int inc , inc1 , inc2 , inc3 , inc4 , tt , ttc = 1000; \シリアル通信で受信したデータの格納 20int m1 , m2 , m3 , m4; 21unsigned char sw1 = 0 , sw2 = 0; 22void setup() { 23 Serial.begin(9600); 24 //ピンの設定 25 pinMode( FENA , OUTPUT ); 26 pinMode( FENB , OUTPUT ); 27 pinMode( RENA , OUTPUT ); 28 pinMode( RENB , OUTPUT ); 29 30 pinMode( FIN1 , OUTPUT ); 31 pinMode( FIN2 , OUTPUT ); 32 pinMode( FIN3 , OUTPUT ); 33 pinMode( FIN4 , OUTPUT ); 34 pinMode( RIN1 , OUTPUT ); 35 pinMode( RIN2 , OUTPUT ); 36 pinMode( RIN3 , OUTPUT ); 37 pinMode( RIN4 , OUTPUT ); 38 39} 40//モータドライバに送る各モータの動きの設定 41void Mov( int A , int B , int C , int D ) { 42 if ( A == 0 ) 43 { 44 45 } else if ( A == 1 ) { 46 digitalWrite( FIN1 , HIGH ); 47 digitalWrite( FIN2 , LOW ); 48 analogWrite( FENA , Pwm1 ); 49 } else if ( A == 2 ) { 50 digitalWrite( FIN1 , LOW ); 51 digitalWrite( FIN2 , HIGH ); 52 analogWrite( FENA , Pwm1 ); 53 } 54 if ( B == 0 ) 55 { 56 57 } else if ( B == 1 ) { 58 digitalWrite( FIN3 , HIGH ); 59 digitalWrite( FIN4 , LOW ); 60 analogWrite( FENB , Pwm2 ); 61 } else if ( B == 2 ) { 62 digitalWrite( FIN3 , LOW ); 63 digitalWrite( FIN4 , HIGH ); 64 analogWrite( FENB , Pwm2 ); 65 } 66 if ( C == 0 ) 67 { 68 69 } else if ( C == 1 ) { 70 digitalWrite( RIN1 , HIGH ); 71 digitalWrite( RIN2 , LOW ); 72 analogWrite( RENA , Pwm3 ); 73 } else if ( C == 2 ) { 74 digitalWrite( RIN1 , LOW ); 75 digitalWrite( RIN2 , HIGH ); 76 analogWrite( RENA , Pwm3 ); 77 } 78 if ( D == 0 ) 79 { 80 81 } else if ( D == 1 ) { 82 digitalWrite( RIN3 , HIGH ); 83 digitalWrite( RIN4 , LOW ); 84 analogWrite( RENB , Pwm4 ); 85 } else if ( D == 2 ) { 86 digitalWrite( RIN3 , LOW ); 87 digitalWrite( RIN4 , HIGH ); 88 analogWrite( RENB , Pwm4 ); 89 } 90} 91//シリアル通信部分(エラーや受信したデータの格納) 92void loop() { 93 switch ( mode ) 94 { 95 case 1: 96 inc = Serial.read(); 97 if ( inc != -1 ) 98 { 99 inc1 = inc; 100 mode = 2; 101 tt = 0; 102 break; 103 } 104 break; 105 case 2: 106 inc = Serial.read(); 107 tt++; 108 if ( inc != -1 ) 109 { 110 inc2 = inc; 111 mode = 3; 112 tt = 0; 113 break; 114 } 115 if ( tt > ttc ) 116 { 117 mode = 1; 118 Serial.print("NG "); 119 Serial.print(tt); 120 Serial.print(" ?2 \n"); 121 tt = 0; 122 break; 123 } 124 break; 125 case 3: 126 inc = Serial.read(); 127 tt++; 128 if ( inc != -1 ) 129 { 130 inc3 = inc; 131 mode = 4; 132 tt = 0; 133 break; 134 } 135 if ( tt > ttc ) 136 { 137 mode = 1; 138 Serial.print("NG "); 139 Serial.print(tt); 140 Serial.print(" ?3 \n"); 141 tt = 0; 142 break; 143 } 144 break; 145 case 4: 146 inc = Serial.read(); 147 tt++; 148 if ( inc != -1 ) 149 { 150 inc4 = inc; 151 mode = 5; 152 tt = 0; 153 break; 154 } 155 if ( tt > ttc ) 156 { 157 mode = 1; 158 Serial.print("NG "); 159 Serial.print(tt); 160 Serial.print(" ?4 \n"); 161 tt = 0; 162 break; 163 } 164 break; 165 case 5: 166 if ( ( ( inc1 >= 48 && inc1 <= 57 ) || (inc1 >= 65 && inc1 <= 90 ) ) && ( ( inc2 >= 48 && inc2 <= 57 ) || (inc2 >= 65 && inc2 <= 80 ) ) && ( ( inc3 >= 48 && inc3 <= 57 ) || (inc3 >= 65 && inc3 <= 80 ) ) && ( ( inc4 >= 48 && inc4 <= 57 ) || (inc4 >= 65 && inc4 <= 80 ) ) ) 167 { 168 Serial.print("OK "); 169 Serial.print(inc1); 170 Serial.print(" : "); 171 Serial.print(inc2); 172 Serial.print(" : "); 173 Serial.print(inc3); 174 Serial.print(" : "); 175 Serial.print(inc4); 176 Serial.print("\n"); 177 mode = 6; 178 tt = 0; 179 break; 180 } 181 else 182 { 183 Serial.print("NG "); 184 Serial.print(inc1); 185 Serial.print(" : "); 186 Serial.print(inc2); 187 Serial.print(" : "); 188 Serial.print(inc3); 189 Serial.print(" : "); 190 Serial.print(inc4); 191 Serial.print(" ?Inv.data "); 192 Serial.print("\n"); 193 mode = 1; 194 tt = 0; 195 break; 196 } 197 break; 198 case 6: 199 inc2 = inc2 - 0x30; 200 inc3 = inc3 - 0x30; 201 inc4 = inc4 - 0x30; 202 mode = 7; 203 break; 204 case 7: 205 if ( inc1 == 0x41 ) { 206 if ( inc2 == 1 ) { 207 Mov( 1 , 1 , 1 , 1 ); 208 } 209 if ( inc2 == 2 ) { 210 Mov( 2 , 2 , 2 , 2 ); 211 } 212 if ( inc2 == 3 ) { 213 Mov( 1 , 2 , 2 , 1 ); 214 } 215 if ( inc2 == 4 ) { 216 Mov( 2 , 1 , 1 , 2 ); 217 } 218 if ( inc2 == 5 ) { 219 Mov( 2 , 1 , 2 , 1 ); 220 } 221 if ( inc2 == 6 ) { 222 Mov( 1 , 2 , 1 , 2 ); 223 } 224 if ( inc3 != 0 ) { 225 Mov( 0 , 0 , 0 , 0 ); 226 } 227 } else if ( inc1 == 0x50 ) { 228 Pwm1 = inc2 * 100 + inc3 * 10 + inc4; 229 } else if ( inc1 == 0x51 ) { 230 Pwm2 = inc2 * 100 + inc3 * 10 + inc4; 231 } else if ( inc1 == 0x52 ) { 232 Pwm3 = inc2 * 100 + inc3 * 10 + inc4; 233 } else if ( inc1 == 0x53 ) { 234 Pwm4 = inc2 * 100 + inc3 * 10 + inc4; 235 } 236 mode = 1; 237 break; 238 } 239 analogWrite(FENA, Pwm1); 240 analogWrite(FENB, Pwm2); 241 analogWrite(RENA, Pwm3); 242 analogWrite(RENB, Pwm4); 243}

ArduinoIDE

1//Node-MCUのプログラムです 2 3#define BLYNK_PRINT Serial 4 5 6#include <ESP8266WiFi.h> 7#include <BlynkSimpleEsp8266.h> 8 9// You should get Auth Token in the Blynk App. 10// Go to the Project Settings (nut icon). 11char auth[] = " authtokunを打ち込む"; 12 13// Your WiFi credentials. 14// Set password to "" for open networks. 15char ssid[] = "WIFIの名前"; 16char pass[] = "WIFIのパスワード"; 17unsigned char hen[10] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 }; 18 19void setup() 20{ 21 // Debug console 22 Serial.begin(9600); 23 24 Blynk.begin(auth, ssid, pass); 25} 26BLYNK_WRITE(V10) //スライダー1(PWM1)処理 27{ 28 int i1, i2, i3; 29 int val = param.asInt(); 30 i1 = hen[val / 100]; 31 i2 = val / 100; 32 i2 = val - (i2 * 100); 33 i2 = hen[i2 / 10]; 34 i3 = hen[val % 10]; 35 Serial.print("P"); 36 Serial.print(i1, 0); 37 Serial.print(i2, 0); 38 Serial.print(i3, 0); 39} 40BLYNK_WRITE(V11) //スライダー2(PWM2)処理 41{ 42 int i1, i2, i3; 43 int val = param.asInt(); 44 i1 = hen[val / 100]; 45 i2 = val / 100; 46 i2 = val - (i2 * 100); 47 i2 = hen[i2 / 10]; 48 i3 = hen[val % 10]; 49 Serial.print("Q"); 50 Serial.print(i1, 0); 51 Serial.print(i2, 0); 52 Serial.print(i3, 0); 53} 54BLYNK_WRITE(V12) //スライダー3(PWM3)処理 55{ 56 int i1, i2, i3; 57 int val = param.asInt(); 58 i1 = hen[val / 100]; 59 i2 = val / 100; 60 i2 = val - (i2 * 100); 61 i2 = hen[i2 / 10]; 62 i3 = hen[val % 10]; 63 Serial.print("R"); 64 Serial.print(i1, 0); 65 Serial.print(i2, 0); 66 Serial.print(i3, 0); 67} 68BLYNK_WRITE(V13) //スライダー4(PWM4)処理 69{ 70 int i1, i2, i3; 71 int val = param.asInt(); 72 i1 = hen[val / 100]; 73 i2 = val / 100; 74 i2 = val - (i2 * 100); 75 i2 = hen[i2 / 10]; 76 i3 = hen[val % 10]; 77 Serial.print("S"); 78 Serial.print(i1, 0); 79 Serial.print(i2, 0); 80 Serial.print(i3, 0); 81} 82 83BLYNK_WRITE(V1) //前進処理 84{ 85 int val = param.asInt(); 86 if ( val == 1 ) 87 { 88 Serial.print("A10B"); 89 } 90 if ( val == 0 ) 91 { 92 Serial.print("A01B"); 93 } 94} 95BLYNK_WRITE(V3) //後進処理 96{ 97 int val = param.asInt(); 98 if ( val == 1 ) 99 { 100 Serial.print("A20B"); 101 } 102 if ( val == 0 ) 103 { 104 Serial.print("A02B"); 105 } 106} 107BLYNK_WRITE(V2) //左処理 108{ 109 int val = param.asInt(); 110 if ( val == 1 ) 111 { 112 Serial.print("A30B"); 113 } 114 if ( val == 0 ) 115 { 116 Serial.print("A03B"); 117 } 118} 119BLYNK_WRITE(V4) //右処理 120{ 121 int val = param.asInt(); 122 if ( val == 1 ) 123 { 124 Serial.print("A40B"); 125 } 126 if ( val == 0 ) 127 { 128 Serial.print("A04B"); 129 } 130} 131BLYNK_WRITE(V5) //左旋回処理 132{ 133 int val = param.asInt(); 134 if ( val == 1 ) 135 { 136 Serial.print("A50B"); 137 } 138 if ( val == 0 ) 139 { 140 Serial.print("A05B"); 141 } 142} 143BLYNK_WRITE(V6) //右旋回処理 144{ 145 int val = param.asInt(); 146 if ( val == 1 ) 147 { 148 Serial.print("A60B"); 149 } 150 if ( val == 0 ) 151 { 152 Serial.print("A06B"); 153 } 154} 155void loop() { 156 157 Blynk.run(); 158}

文字数制限があるので制作した動かないRubyプログラムは下のコメントに追加します。
##補足
ArduinoIDE1.8.2を使用
ArduinoIDEにhttp://arduino.esp8266.com/stable/package_esp8266com_index.json
のパッケージをインストールさせています(Node-MCU用の環境設定)
またArduinoIDEにBLYNKのカスタムライブラリをいれています。
以下の画像がNode-MCU用の設定です
イメージ説明
RubicではボードはGR-CITRUSを選択し、ファームウェアはwrbb-v2liv-firm、リビジョンは2.12です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こういう案件を見ていつも思うのは、なぜみんないきなり全部作って動かないと騒ぐのだろう、ということですね
まずは基本的な機能から実装していきましょう。

  • GPIOの操作を移植、実装する

通信やら何やらはまず置いといて、GPIOの動作をしっかり実装しましょう。これが意図通りしっかり動作するのを確認して次に進みます

  • シリアル通信を実装する

GPIOは横においておいて、シリアル通信を確実にできるように実装します。動作のチェックのためには、USB-シリアル変換基板を購入しときましょう。
PC側でターミナルソフトを操作して、通信が正常に行われるようにきちんとデバッグしましす。

この上の2点がろくにできてないうちに動作しないと騒いでいるのでは、おはなしになりません。

投稿2019/11/02 00:34

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問