質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Arduino

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

Q&A

解決済

2回答

4601閲覧

Arduinoにひらがな、例えば「あ」を送信し、受け取った値(UTF-8)からLEDを点灯させたいです。

Hiroyadesu

総合スコア14

Arduino

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

0グッド

0クリップ

投稿2018/04/17 08:32

編集2018/04/18 01:50

Arduino初心者です。
Arduinoにひらがなを送信し、その3バイトのデータをもとにLEDを制御したいです。if文の条件式が間違ってるのだと思いますが、何が間違いかわかりません。どなたかわかる方いれば教えてください。お願いします。

arduino

1char dat[5]; //送信された文字を受け取る配列 2 3void setup() { 4 // put your setup code here, to run once: 5 Serial.begin(9600); 6 pinMode(13,OUTPUT); 7} 8 9void loop() { 10 // put your main code here, to run repeatedly: 11 12 if (Serial.available() >= 3) { // 受信バッファに 3文字以上たまったら 13 for(int i=0; i<3; i++) { // for文で 3回ループし 14 dat[i] = Serial.read(); // 1バイトずつデータを格納 15 Serial.println(dat[i]); 16 } 17 dat[3] = '\0'; // データの最後に文字の終端コードを入れる 18 19 Serial.print("DATA = "); 20 Serial.println(dat); 21 22 //16進数で「あ」表示 23 Serial.println(dat[0],HEX); //FFFFFFE3 24 Serial.println(dat[1],HEX); //FFFFFF81 25 Serial.println(dat[2],HEX); //FFFFFF82 26 27 if(dat[0] == 'FFFFFFE3' && dat[1] == 'FFFFFF81' && dat[2] == 'FFFFFF82'){ 28 Serial.println("LED ON"); 29 digitalWrite(13,HIGH); 30 delay(1000); 31 digitalWrite(13,LOW); 32 delay(400); 33 } 34 } 35 36} 37

無事解決しました。
修正したプログラムは以下です。ありがとうございました。

arduino

1unsigned char dat[5]; //送信された文字を受け取る配列 2 3void setup() { 4 // put your setup code here, to run once: 5 Serial.begin(9600); 6 pinMode(13,OUTPUT); 7 pinMode(12,OUTPUT); 8 pinMode(11,OUTPUT); 9} 10 11void loop() { 12 // put your main code here, to run repeatedly: 13 14 if (Serial.available() >= 3) { // 受信バッファに 3文字以上たまったら 15 for(int i=0; i<3; i++) { // for文で 3回ループし 16 dat[i] = Serial.read(); // 1バイトずつデータを格納 17 //Serial.println(dat); 18 } 19 dat[3] = '\0'; // データの最後に文字の終端コードを入れる 20 21 Serial.print("DATA = "); 22 //Serial.println(dat); 23 24 Serial.println(dat[0],HEX); 25 Serial.println(dat[1],HEX); 26 Serial.println(dat[2],HEX); 27 28 29 // ひらがな「り」を受け取るとLED13番点灯 30 if(dat[0] == 0xE3 && dat[1] == 0x82 && dat[2] == 0x8a){ 31 Serial.println("LED ON"); 32 digitalWrite(13,HIGH); 33 delay(200); 34 digitalWrite(13,LOW); 35 delay(400); 36 } 37 38 // ひらがな「ん」を受け取るとLED12番点灯 39 if(dat[0] == 0xE3 && dat[1] == 0x82 && dat[2] == 0x93){ 40 Serial.println("LED ON"); 41 digitalWrite(12,HIGH); 42 delay(200); 43 digitalWrite(12,LOW); 44 delay(400); 45 } 46 47 // ひらがな「ご」を受け取るとLED11番点灯 48 if(dat[0] == 0xE3 && dat[1] == 0x81 && dat[2] == 0x94){ 49 Serial.println("LED ON"); 50 digitalWrite(11,HIGH); 51 delay(200); 52 digitalWrite(11,LOW); 53 delay(400); 54 } 55 56 57 } 58 59 // 受信バッファをクリア 60 Serial.flush(); 61 62}

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

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

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

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

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

guest

回答2

0

別回答のように、受信バッファをunsigned char にして、バイト列を比較しましょう。
char にすると、データの最上位ビットが立つデータはマイナスの表現となってしまいます

if(dat[0] == 'FFFFFFE3' && dat[1] == 'FFFFFF81' && dat[2] == 'FFFFFF82'){

これは間違ってます。そもそもコンパイルエラーが出てコンパイルさえできません

投稿2018/04/17 11:46

y_waiwai

総合スコア87719

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

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

Hiroyadesu

2018/04/17 12:20

解答ありがとうございます。 明日の授業でまたArduinoを触る機会があるのでやってみます。 はい、私もそこでエラーが出たのは気づいたのですが、どう解決すればいいかわからなくてそのままにしてしまいました。型をunsigned char にしてやってみようと思います。 ありがとうございます。
y_waiwai

2018/04/17 12:22

そこでなぜエラーが出るのかを理解しておこう。
Hiroyadesu

2018/04/18 02:24

はい。調べたところ、私が扱っているUTF-8が16進数で表されるもので、char型だと-128から127なのでビット配列にするとおかしくなるみたいです。下の記事を参考にしました。 http://www.symmetric.co.jp/blog/archives/92 まだはっきりと原因の深くを追求できていないのですが、入り口が見えました。 前の質問に引き続き解答いただき本当にありがとうございます。 無事解決いたしました。
guest

0

ベストアンサー

I think that you may use 'unsigned char' instead of 'char'.

Arduino

1unsigned char dat[5]; //送信された文字を受け取る配列 2 3 : 4 5if(dat[0] == 0xE3 && dat[1] == 0x81 && dat[2] == 0x82) 6{ 7 Serial.println("LED ON"); 8 digitalWrite(13, HIGH); 9 delay(1000); 10 digitalWrite(13, LOW); 11 delay(400); 12}

The Compilar will casts all values into 2 bytes or 4 bytes integer when compare it with a numeric value.
However, 'char' allows only -128 to 127 and could not contains 0xE3 that means 227.

More information:

dat[0] == 'FFFFFFE3'

This means that comparing their pointers. I think it will not be muched if dat[0] has same value as 'FFFFFFE3'.

Addition: Size of int.
  • Arduino Uno - 2 bytes.
  • Arduino Due - 4 bytes.

投稿2018/04/17 11:26

編集2018/04/17 11:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Hiroyadesu

2018/04/17 12:21 編集

解答ありがとうございます。 プログラムまで直してくれて、本当に頭が上がりません。 配列宣言時の型に問題があるのですか。自分では気づかなかったです。 また学校で明日Arduinoに触ることができるのでやってみます。 解決したらご連絡いたします。ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/04/17 12:18

Let's enjoy !
Hiroyadesu

2018/04/17 12:21

Thank you so much. I'll do it.
Hiroyadesu

2018/04/18 01:47

おはようございます。 今学校で昨日ご指摘していただいた箇所を直してArduinoを動かしてみたところ、しっかりと動作させることができました。ありがとうございます。「りんご」という文字列を受け取ってそれぞれのLEDを点滅させるプログラムが完成しました!上記に組んだプログラムを載せます。ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/04/18 02:16

That's nice. Putting LEDs lights under program control is very funny.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問