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

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

ただいまの
回答率

90.61%

  • Arduino

    515questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 268

Hiroyadesu

score 4

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

char dat[5];  //送信された文字を受け取る配列

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

   if (Serial.available() >= 3) {  // 受信バッファに 3文字以上たまったら
    for(int i=0; i<3; i++) {      // for文で 3回ループし
      dat[i] = Serial.read();     // 1バイトずつデータを格納
      Serial.println(dat[i]);
    }
    dat[3] = '\0';                // データの最後に文字の終端コードを入れる

    Serial.print("DATA = ");
    Serial.println(dat);  

    //16進数で「あ」表示
    Serial.println(dat[0],HEX); //FFFFFFE3
    Serial.println(dat[1],HEX); //FFFFFF81
    Serial.println(dat[2],HEX); //FFFFFF82

    if(dat[0] == 'FFFFFFE3' && dat[1] == 'FFFFFF81' && dat[2] == 'FFFFFF82'){
      Serial.println("LED ON");
      digitalWrite(13,HIGH);
      delay(1000);
      digitalWrite(13,LOW);
      delay(400);
    }
  }

} 

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

unsigned char dat[5];  //送信された文字を受け取る配列

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

   if (Serial.available() >= 3) {  // 受信バッファに 3文字以上たまったら
    for(int i=0; i<3; i++) {      // for文で 3回ループし
      dat[i] = Serial.read();     // 1バイトずつデータを格納
      //Serial.println(dat);
    }
    dat[3] = '\0';                // データの最後に文字の終端コードを入れる

    Serial.print("DATA = ");
    //Serial.println(dat);  

    Serial.println(dat[0],HEX); 
    Serial.println(dat[1],HEX);
    Serial.println(dat[2],HEX);


    // ひらがな「り」を受け取るとLED13番点灯
    if(dat[0] == 0xE3 && dat[1] == 0x82 && dat[2] == 0x8a){
      Serial.println("LED ON");
      digitalWrite(13,HIGH);
      delay(200);
      digitalWrite(13,LOW);
      delay(400);
    } 

    // ひらがな「ん」を受け取るとLED12番点灯 
    if(dat[0] == 0xE3 && dat[1] == 0x82 && dat[2] == 0x93){
      Serial.println("LED ON");
      digitalWrite(12,HIGH);
      delay(200);
      digitalWrite(12,LOW);
      delay(400);
    } 

    // ひらがな「ご」を受け取るとLED11番点灯 
    if(dat[0] == 0xE3 && dat[1] == 0x81 && dat[2] == 0x94){
      Serial.println("LED ON");
      digitalWrite(11,HIGH);
      delay(200);
      digitalWrite(11,LOW);
      delay(400);
    } 


  }

  // 受信バッファをクリア
  Serial.flush();

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 21:20

    解答ありがとうございます。

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

    キャンセル

  • 2018/04/17 21:22

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

    キャンセル

  • 2018/04/18 11:24

    はい。調べたところ、私が扱っているUTF-8が16進数で表されるもので、char型だと-128から127なのでビット配列にするとおかしくなるみたいです。下の記事を参考にしました。
    http://www.symmetric.co.jp/blog/archives/92

    まだはっきりと原因の深くを追求できていないのですが、入り口が見えました。
    前の質問に引き続き解答いただき本当にありがとうございます。
    無事解決いたしました。

    キャンセル

checkベストアンサー

0

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

unsigned char dat[5];  //送信された文字を受け取る配列

 :

if(dat[0] == 0xE3 && dat[1] == 0x81 && dat[2] == 0x82)
{
    Serial.println("LED ON");
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
    delay(400);
}

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 21:17 編集

    解答ありがとうございます。

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

    キャンセル

  • 2018/04/17 21:18

    Let's enjoy !

    キャンセル

  • 2018/04/17 21:21

    Thank you so much. I'll do it.

    キャンセル

  • 2018/04/18 10:47

    おはようございます。

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

    キャンセル

  • 2018/04/18 11:16

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Arduino

    515questions

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