НАСТРАИВАТЬ:
ГЛАВНОЕ УСТРОЙСТВО: Raspberry Pi Model B REV_2
ПОДЧИНЕННОЕ УСТРОЙСТВО: Arduino Uno REV_3
ПРОБЛЕМА:
Каждый раз, когда я ввожу «r» в командную строку, он возвращает число, которое полностью отличается от того, что должно быть. Например, когда я подключаю перемычку к аналоговому выводу A0 до 5 В и нажимаю «r» в командной строке, она должна возвращать 5 вольт. Ну, он вернул 255. Когда я подключил перемычку к выводу 3,3 В, он вернул 169.
ЗАМЕТКА:
Человек, написавший этот код, заметил кое-что, что, как я думал, могло быть связано с этой проблемой. Его слова были такими ...
Затем функция настройки в Arduino устанавливает две функции обратного вызова, которые будут использоваться. Функция processMessage будет вызываться всякий раз, когда происходит событие on Receive. Это будет всякий раз, когда команда отправляется с Raspberry Pi. Другая функция обратного вызова, sendAnalogReading, связан с событием onRequest. Это происходит, когда Raspberry Pi запрашивает данные и считывает аналоговое значение, делит его на четыре, чтобы оно поместилось в один байт, а затем отправляет его обратно в Raspberry Pi ».
Я понятия не имею, что он имел в виду, разделив значение, чтобы оно поместилось в один байт. Вот почему мне возвращаются странные числа? Кто-нибудь может это объяснить.
Чтобы сделать этот поток более понятным, вот моя настройка и вывод, который отображается при выполнении нескольких команд.
sudo python ardu_pi_i2c.py // запустил мою программу
В первом сценарии я подключил перемычку от контакта A0 к GRD на Arduino. Затем я выбрал вариант «r», и он дал мне «0»
Во втором сценарии я подключил перемычку от контакта A0 к 5V на Arduino. Затем я выбираю "r" и получаю "255".
Третий сценарий я подключил перемычку от контакта A0 к 3,3 В. Получилось 171.
В четвертом сценарии я подключил перемычку от контакта A0 к отрицательной стороне светодиода, и это дало мне «0».
В пятом сценарии я подключил перемычку от контакта A0 к положительной стороне светодиода, и это дало мне "105".
Поскольку первый и четвертый сценарии, похоже, работают хорошо, мне любопытно, почему другие числа находятся далеко, и имеют ли они какое-то реальное значение для них.
КОД ПУЭДО:
//Creates instance of SMBus called bus
//Prompts user for command "l" (toggles led) or "r" (reads from Analog pin 0)
//if command is l it writes it to arduino and causes onReceive handler(processmessage)
//if command is r then request_reading function will be called
//this will call read_byte in SMBus library that causes the on Request event to be invoked.
ПРОГРАММА PYTHON
import smbus
import time
bus = smbus.SMBus(1)
SLAVE_ADDRESS = 0x04
def request_reading():
reading = int(bus.read_byte(SLAVE_ADDRESS))
print(reading)
while True:
command = raw_input("Enter command: l - toggle LED, r - read A0 ")
if command == 'l' :
bus.write_byte(SLAVE_ADDRESS, ord('l'))
elif command == 'r' :
request_reading()
ПРОГРАММА ARDUINO
#include <Wire.h>
int SLAVE_ADDRESS = 0x04;
int ledPin = 13;
int analogPin = A0;
boolean ledOn = false;
void setup()
{
pinMode(ledPin, OUTPUT);
Wire.begin(SLAVE_ADDRESS);
Wire.onReceive(processMessage);
Wire.onRequest(sendAnalogReading);
Serial.begin(9600);
}
void loop()
{
}
void processMessage(int n){
Serial.println("In processMessage");
char ch = Wire.read();
if (ch == 'l'){
toggleLED();}}
void toggleLED(){
ledOn = ! ledOn;
digitalWrite(ledPin, ledOn);}
void sendAnalogReading(){
Serial.println("In sendAnalogReading");
int reading = analogRead(analogPin);
Wire.write(reading >> 2);}