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

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

詳細はこちら
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

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

Q&A

解決済

2回答

944閲覧

ラズパイで取得した可変抵抗器のデジタル値をArduinoにUSBでシリアル通信をして送りたい

nosuke_ko

総合スコア5

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

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

0グッド

0クリップ

投稿2019/11/18 09:05

前提・実現したいこと

ADコンバーターを用いて可変抵抗器からデジタル値をラズパイで取得し、USBを用いたシリアル通信でArduinoに値を送ろうとしています。通信はできているのですが、Arduinoに送られた値がラズパイで取得した値と異なっていると思われます。どのようなコードを書けばラズパイで取得した値がそのままArduinoに送られるのかぜひ教えていただきたいです。
現段階としてラズパイから取得した値val<500でLEDが光るようにしたところ、ちゃんと光りました。一方で試しにval>500で光るようにしたところ、光りませんでした。

初めての質問で、稚拙な文章になってしまい申し訳ありません。

発生している問題・エラーメッセージ

ラズパイからArduinoに送られた値がラズパイで取得した値と異なる。

該当のソースコード

import RPi.GPIO as GPIO import serial from time import sleep GPIO.setwarnings(False) ser = serial.Serial('/dev/ttyACM0',9600) def readadc(adcnum, clockpin, mosipin, misopin, cspin): if adcnum > 7 or adcnum < 0: return -1 GPIO.output(cspin, GPIO.HIGH) GPIO.output(clockpin, GPIO.LOW) GPIO.output(cspin, GPIO.LOW) commandout = adcnum commandout |= 0x18 # スタートビット+シングルエンドビット commandout <<= 3 # LSBから8ビット目を送信するようにする for i in range(5): if commandout & 0x80: GPIO.output(mosipin, GPIO.HIGH) else: GPIO.output(mosipin, GPIO.LOW) commandout <<= 1 GPIO.output(clockpin, GPIO.HIGH) GPIO.output(clockpin, GPIO.LOW) adcout = 0 for i in range(13): GPIO.output(clockpin, GPIO.HIGH) GPIO.output(clockpin, GPIO.LOW) adcout <<= 1 if i>0 and GPIO.input(misopin)==GPIO.HIGH: adcout |= 0x1 GPIO.output(cspin, GPIO.HIGH) return adcout GPIO.setmode(GPIO.BCM) SPICS = 8 SPIMISO = 9 SPIMOSI = 10 SPICLK = 11 GPIO.setup(SPICLK, GPIO.OUT) GPIO.setup(SPIMOSI, GPIO.OUT) GPIO.setup(SPIMISO, GPIO.IN) GPIO.setup(SPICS, GPIO.OUT) try: while True: inputVal0 = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS) ser.write(inputVal0) print(inputVal0) sleep(0.2) except KeyboardInterrupt: pass GPIO.cleanup()
python
int val=0; #define LED_PIN 13 void setup() { pinMode(LED_PIN,OUTPUT); Serial.begin(9600); } void loop() { if(Serial.available() > 0){ val = Serial.read(); } if(val < 500){ digitalWrite(LED_PIN,HIGH); } delay(100); }
```ここに言語名を入力 c言語

補足情報(FW/ツールのバージョンなど)

Arduinoから直接USBでラズパイに接続しているので、シリアルモニターを用いた値の確認はできない状態です。

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

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

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

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

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

guest

回答2

0

ベストアンサー

serialのwriteは引数がbytes型のようです。
inputVal0はint型だと思うので、想定しているようなデータのやり取りにはならないと思います。

arduinoのreadは1バイト読み込みなので、送信側はinputVal0.to_bytes(1, byteorder='big')と1バイトのみのbytesに変換してから送信するべきでしょう。

投稿2019/11/18 23:55

ta.fu

総合スコア1722

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

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

nosuke_ko

2019/11/19 08:56

ご回答ありがとうございます。アドバイスのおかけで無事問題解決いたしました。ずっと悩んでいたので、本当に助かりましたありがとうございす。
guest

0

if(Serial.available() > 0){

val = Serial.read();

}

なにか受信されたら即座に読み出してますが、これでは1文字しか読みだせません。これではだめでしょう

  • 送信側は、数値の文字列とともに改行コードを送る
  • 受信側は改行コードが来るまで受信文字列をためておいて、改行コードが来たら受信文字列を整数変換し処理する

というふーにしましょう

投稿2019/11/18 09:20

y_waiwai

総合スコア88038

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

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

nosuke_ko

2019/11/18 10:00

ご回答ありがとうございます!参考にさせていただきます!僕はまだまだプログラミング初心者なのですぐにはコードを思いつかないかもしれませんが、考えてみます。
y_waiwai

2019/11/18 10:04

ネットを探したら同等の工作例はあると思うので探してみるのもいいかと思います。 また、シリアルーUSB変換基板を用意して、ラズパイの送信をPCで見れるようにしといたほうがいいでしょうね
nosuke_ko

2019/11/19 08:57 編集

似たようなことをしようとしている人がいらっしゃってその方のコードを参考に無事作ることができました。ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問