Arduino Uno + Raspberry Pi = I2C

pirantel
Offline
Зарегистрирован: 15.08.2013

Завязал Arduino Uno с Raspberry Pi v.2 по i2c, ардуино (slave),малина (master). На ардуино подключены два аналоговых датчика (датчик газа и датчик пламени), вопрос состоит в том, что нужно внести в код pythona чтобы он мог распознавать информацию отосланной ардуинкой.

Думал отправлять с ардуино массив целочисленных (int) - но при компиляции выдает ошибку, можно только отсылать массив байтов (byte), но так как у них ограничение до 255, а датчики конечный свои результат выдает и свыше 1000.

Просто особых навыков программирования на питоне не имею, старался гуглить больше, но мозгов пока хватило только на это. Может кто поможет?

Предоставляю скет ниже :

#include <Wire.h> //библиотека i2c
#define SLAVE_ADDRESS 0x04 // ардуино объявлена слейвом
int gas = 0; // переменная газового датчика
int flame = 0; // переменная датчика пламени
int number = 0; // переменная

void setup()
{
  Serial.begin(9600); //Set serial baud rate to 9600 bps
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive(receiveData);
  Wire.onRequest (sendData);
  Serial.println("Ready!");

}

void loop()
{
  delay(1000);
}

void receiveData(int byteCount)
{
  while(Wire.available()) {
    number = Wire.read();
  }
}

void sendData()
{
  gas=analogRead(0);
  flame=analogRead(1);

  Serial.print("Gas in air: ");
  Serial.println(gas,DEC);
  Serial.print("Flame in air: ");
  Serial.println(flame,DEC);
  Wire.write(gas);
  delay(100);
  Wire.write(flame);
}


И код на Python-e

import smbus
import time

bus = smbus.SMBus(1)

address = 0x04

def writeNumber(value):
    bus.write_byte(address, value)
    return -1

def readGas():
     gas = bus.read_byte(address)
     return gas

time.sleep(0.1)
	 
def readFlame():	 
	 flame = bus.read_byte(address)
	 return flame
	 
while True:
    var = input("Enter number: ")
    if not var:
	  continue
    writeNumber(var)
	
  # sleep one second
    time.sleep(1)

    gas = readGas()
    flame = readFlame()

print "Gas in the air: ", gas
print
print "Flame: ", flame
print

 

RANDREY
Offline
Зарегистрирован: 10.06.2012

особо в си не разбираюсь, но можно отправлять несколько byte вместо одного int, перед отправкой дробить их,

как word== 2 byte (0...65535) та и на приемнике малины брать байты и переводить в соотвествующий тип по формуле типа

(low+ hight byte *255) 

pirantel
Offline
Зарегистрирован: 15.08.2013

Да,кстати, была идея, перевести массив int в byte. Потому что именно с библиотекой wire.h он принимает и компилирует только массив из байтов, но не как с целочисленными. Спасибо за ответ. Буду курить форум и инет в этом направлении.

Еще была идейка (так как byte = 0..255) разделить результат от датчиков на несколько состояний, и уже с одним из них работать (состоянии уже могут принимать значение как раз до 255), но блин..не совсем устраивает такое решение поставленной задачи :( 

Rouslan
Offline
Зарегистрирован: 28.08.2013

Так для информации, когда связываете ардуино с распберри нужно использовать logic level converter. Иначе можно сжечь распберри. 

https://www.sparkfun.com/products/8745

По поводу вопроса, я на днях пролистал книгу getting started with raspberry pi от o'reilly, там наглядно описывали как нужно посылать сигнал с ардуино на распберри. Точно описать не могу т.к. сам только начинающий с распберри. 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

офтоп немного... но как бы размышлял одно время и так не нашел ответа.. какой смысл добавлять разбери к ардуино? ардуино не само достаточен?

Клапауций
Offline
Зарегистрирован: 10.02.2013

Puhlyaviy пишет:

офтоп немного... но как бы размышлял одно время и так не нашел ответа.. какой смысл добавлять разбери к ардуино? ардуино не само достаточен?

дуино к расбери

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций пишет:

дуино к расбери

один фиг, в чем смысл то?

Клапауций
Offline
Зарегистрирован: 10.02.2013

Puhlyaviy пишет:

один фиг, в чем смысл то?

Это общий философский вопрос для получения ответа на который погибло много народу - лучше не спрашивай.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций пишет:

Это общий философский вопрос для получения ответа на который погибло много народу - лучше не спрашивай.

просто прикрутил ноутбук к лаптопу, клейкой лентой.. думаю вот теперь хорошо это или плохо :)

Rouslan
Offline
Зарегистрирован: 28.08.2013

Ноутбук это и есть лаптоп;) 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Rouslan пишет:

Ноутбук это и есть лаптоп;) 

не соглашусь... это немного разные вещи.. НЕМНОГО! :)

так никто мне и не ответил ЗАЧЕМ?

Rouslan
Offline
Зарегистрирован: 28.08.2013

 

на самом деле я заказал себе распберри в дополнение к уно только для того что бы не париться со всякмим шилдами. Если соединить распберри с ардуино, то у ардуино появиться возможность выходить в сеть через ethernet, подключать usb периферию вроде wifi-модуля. Если брать отдельно шилды, то их стоимость превысит одного распберри. Почему нельзя было взять сразу распберри? Потому что мне не очень удобно пользоваться постоянно консолью и питоном, а к ардуино ide я уже привык. Или спалив процессор на уно можно его поменять за 3-4$

Так же можно потом хвастаться перед знакомыми какой ты хакер))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

тоесть а УНО со встроеной сетью и ПОЕ вас не устраивает? И пытаюсь представить как можно спалить процесор? Разве что автогеном... и подключения сразу и кабельного изернета и WIFI, какой то глубинный смысл?

http://beagleboard.org/Products/BeagleBone%20Black

во сразу к монитору выход и линукс на нем живет и изернет и крестиком вышивает...

Клапауций
Offline
Зарегистрирован: 10.02.2013

Puhlyaviy, что ты докопался к человеку - нормальный вариант расбери + дуина.

Газовому котлу твиттер завести, котэ и собаку научить свои фотки в инстаграмм постить...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций пишет:

Puhlyaviy, что ты докопался к человеку - нормальный вариант расбери + дуина.

Газовому котлу твиттер завести, котэ и собаку научить свои фотки в инстаграмм постить...

пытаюсь понять, мне правда интересно, просто обсуждали как то такой вариант, но так толком и не выяснили зачем такое может быть нужно... подумалось может челеовек нашел какое то необычное использование и мне оно вдруг тоже нада, но я об этом типа пока еще не знаю .. О.о

Rouslan
Offline
Зарегистрирован: 28.08.2013

В уно нет встроенной сетевой карты, для нее нужен спец шилд.

Спалить процессор можно прямиком подключив двигатель к digitalOut 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013
Rouslan
Offline
Зарегистрирован: 28.08.2013

И что ты нашел? Seeduino

Вот тут где выход для ethernet? http://arduino.ru/Hardware/ArduinoBoardUno

вот скажи, ты сможешь сделать полноценный медиацентр из ардуино и при этом еще оставить возможность для контроля над розетками? Вряд ли, потому что процессор ардуино не может выполнять 2 задачи параллельно. Все его задачи выполняются последовательно. Да, есть библиотеки который ЯКОБЫ позволяют создают многозадачность, но они занимают много места и все равно задачи выполняются последовательно. 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Rouslan пишет:

И что ты нашел? Seeduino

Вот тут где выход для ethernet? http://arduino.ru/Hardware/ArduinoBoardUno

вот скажи, ты сможешь сделать полноценный медиацентр из ардуино и при этом еще оставить возможность для контроля над розетками? Вряд ли, потому что процессор ардуино не может выполнять 2 задачи параллельно. Все его задачи выполняются последовательно. Да, есть библиотеки который ЯКОБЫ позволяют создают многозадачность, но они занимают много места и все равно задачи выполняются последовательно. 

лехко!

все процесоры выполняют одну задачу в один момент :) паралельность это програмирование :) или вы себе в маленьком плеере за 5 баксов идите офигенский кластер с паралельными вычислениями? типа и музыку играет и еще за кнопками следит и на дисплее что то выводит.. :)

Вы не путайте ARDUINO UNO которая является платой для макетных разработок и законченые продукты которые имеют тот же процесор и могут быть запрограмированы с использованием ардуиновского ИДЕ..

 

Rouslan
Offline
Зарегистрирован: 28.08.2013

Ну ладно, уговорил :)

pirantel
Offline
Зарегистрирован: 15.08.2013

Подключение Малинке к Ардуинке Уно, связана с тем, что это две разные платформы и системы, ардуино - микроконтроллерная система, малинка - микропроцессорная. В моем случае, Малинка выступает в роли сервера, которые получает и обрабатывает сигналы, и выводит их в веб-интерфейс, а ардуино - микроконтролер, на которую подвешены большинство аналоговых (на малинке вроде как один пин может принимать аналоговый сигнал, но АЦП у него нет) ну и цифровых датчиков (непосредственно на малину тоже можно подкинуть цифровых датчиков). И все в этой завязке большая система, которая может управлять данными и выводить их в различные системы, куда вам пожелается.

leshak
Offline
Зарегистрирован: 29.09.2011

Да не трудно придумать зачем "малина плюс дуина" нужны будут. 

малина - тяжелая (отностиельно) логика, веб-серверы и т.п.
дуина - совместимость с шилдами, куча библиотек готовых, реалаймовость  (понятно что на малине можно реалтаймовости добится, но тогда удобство в качестве "более высокоуровневого" - упадет).

Для подобной связки кошусь еще в сторону вот такой карточки:

Хакаем Transcend WiFi SDHC карту памяти / Хабрахабр

А вот тут - у нее уже RX/TX нашли :)

Новый Vogue. Теперь банановый / Хабрахабр

Так что общатся с дуиной - не видно проблем. И компактенй чем малина :)