Использование I2C для чтения значения с аналогового вывода на Arduino и отправки его на Raspberry Pi. Он возвращает странные числа, например 122 или 255.

НАСТРАИВАТЬ:

ГЛАВНОЕ УСТРОЙСТВО: 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);}

person Shane Yost    schedule 02.03.2014    source источник


Ответы (1)


Я считаю, что вывод - это число в диапазоне от 0 до 255 (все значения, которые помещаются в один байт), соответствующее диапазону от 0 до 5 вольт. Итак, чтобы преобразовать считанное число в напряжение, вы делаете

voltage = number * 5.0 / 255.

Вы обнаружите, что для number = 255 вы получите voltage = 5.0;
а для number = 171 вы получите voltage = 3.35

Мне кажется. Это означает, что напряжение на положительной стороне светодиода равно

105 * 5.0 / 255 = 2.05 V

Что не является сумасшедшей ценностью.

person Floris    schedule 02.03.2014