前提・実現したいこと
①ラズパイで取得した可変抵抗器の値を取得 (実現済み)
②2線式RS485のUSBを用いてシリアル通信で値をArduinoに送信(200mのケーブルを介しています)
③ラズパイから受け取った値を適切に変換してモーターを駆動する
発生している問題・エラーメッセージ
ラズパイからArduinoへ送信した値がArduinoで正しく受け取れていない。
該当のソースコード
ラズパイ側 Python # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import serial import time from time import sleep GPIO.setwarnings(False) ser = serial.Serial('/dev/ttyUSB0',9600) ~ 可変抵抗器の値を取得するためのコード ここは問題ないので省略します ~ try: while True: inputVal0 = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS) //inputVal0には可変抵抗器の値が入っています head = 128 high = (inputVal0 >> 7) & 127 low = inputVal0 & 127 headByte = head.to_bytes(1, 'big') highByte = high.to_bytes(1, 'big') lowByte = low.to_bytes(1, 'big') ser.write(headByte) ser.write(highByte) ser.write(lowByte) print(inputVal0) sleep(1.0) //このwhileの中のコードはすべて動いていることが確認できました。 except KeyboardInterrupt: pass GPIO.cleanup()
Arduino側 C言語 #include <stdio.h> #include <stdlib.h> #include <Servo.h> Servo motor; int val = 0; bool isValid = false; void setup() { Serial.begin(9600); motor.attach(9); delay(500); } void loop() { isValid = false; if (Serial.available() >= 0) { // Lチカを使ってここまでコードを 読めていることは確認できました。 int head = Serial.read(); if (head == 128) { int high = Serial.read(); int low = Serial.read(); val = (high<<7) + low; int vel = map(val,0,4095,1300,1700); //ラズパイから受け取った可変抵抗器の値を変換 motor.writeMicroseconds(vel); if (0 <= val <= 1023) { isValid = true; } } }else{ Serial.print("not available"); } delay(100); }
補足情報(FW/ツールのバージョンなど)
ラズパイは Raspberry pi 3 Model B
ArduinoはELEGOO UNO R3
を使用しています。