Передача аналогового сигнала на другую Arduino

serginusoid
Offline
Зарегистрирован: 19.08.2014

Доброго времени суток, уважаемые форумчане.Сегодня столкнулся с такой проблеммой - есть две Arduino Uno, в первой в мамяти хранится некая переменная, значение которой необходимо передать на другую Ардуинку.Полазив по справочной информации на этом сайте попытался сделать след.образом: соединил 9-й пин первой Ардуино с выходом А0 второй. В прошивке програмно отправлял с первой через команду AnalogWrite, и на второй, через команду AnalogRead() принимал.В результате получал только 2 значения 1023 и 0 (как я подозреваю оно передавало значения HIGH и LOW).Просветите неграмотного, как можно решить эту проблемму. Большое спасибо.

Leshiy
Offline
Зарегистрирован: 19.07.2014

Если значение целочисленное, то его можно передавать импульсами, например так:

Ардуино 1 устанавливает на выходе PIN3 низкий уровень сигнала. А сам выход PIN3 подключен к PIN3 на второй Ардуино, только там он не выход, а вход.
Ардуино 2 видит, что на PIN3 низкий уровень сигнала, понимает, что сейчас начнётся передача данных и разрешает работу внешних прерываний
Ардуино 1 меняет состояние на PIN4 (каждое изменение состояния это +единица к счётчику)
Ардуино 2 отлавливает по прерыванию изменение состояния на своём PIN4 и прибавляет к счётчику единицу
...
Так повторяется до тех пор, пока Ардуино 1 не передаст всю информацию. По окончании передачи Ардуино 1 устанавливает на выхоlе PIN3 высокий уровень и этим сообщает Ардуино 2, что передача окончена.
Ардуино 2 запрещает прерывания, смотрит, сколько насчитал счётчик и потом использует эти данные так, как вам нужно.

Вот таким образом можно передавать самую разнобразную информацию с одной Ардуино на другую Ардуино.

Но если этот, вне всякого сомнения, гениальный способ вам почему то не подойдёт, то можно сделать так - http://rfanat.ru/s19/ardu-sv2pl.html

===

Удивительно, но оказалось, что информации на русском о соединении двух ардуино по проводам очень мало.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

serginusoid пишет:

Доброго времени суток, уважаемые форумчане.Сегодня столкнулся с такой проблеммой - есть две Arduino Uno, в первой в мамяти хранится некая переменная, значение которой необходимо передать на другую Ардуинку.Полазив по справочной информации на этом сайте попытался сделать след.образом: соединил 9-й пин первой Ардуино с выходом А0 второй. В прошивке програмно отправлял с первой через команду AnalogWrite, и на второй, через команду AnalogRead() принимал.В результате получал только 2 значения 1023 и 0 (как я подозреваю оно передавало значения HIGH и LOW).Просветите неграмотного, как можно решить эту проблемму. Большое спасибо.

если по вашему варианту, то нужен ЦАП на 21 резисторе по схеме матрицы R2R.... такой ЦАП задействует 10 пинов на выход.... тогда ардуина_1 будет выдавать через ЦАП значения ( в виде напряжения ) 0...1023

ардуина_2 аналоговым пином сможет принимать эти значения, но с ошибкой :(

кроме ошибки ещё одна проблема - СИНХРОНИЗАЦИЯ приёма передачи

 

:) прикольный способ :) посмотрите патенты ! может этот способ ещё не запатентован :)-

Valentinych
Offline
Зарегистрирован: 13.08.2014

Целесообразнее посмотреть в сторону дельта-сигма модуляции (гугл выдаст массу информации). Для передачи сигнала достаточно 1 линии. Плюс линия для синхронизации. И никаких R2R огородов с десятью выходными пинами.

Вообще-то, вопрос в топике задан как-то странно - в шапке речь идет о передаче аналогового сигнала, в тексте - о передаче некоей переменной. Если аналоговый (периодический, непрерывный, длительный...) сигнал - то дельта-сигма, если отдельно взятая переменная - то стандартные процедуры ардуино. Кроме того, если речь идет-таки об аналоговым сигнале, желательно указать его динамический и частотный диапазоны. Это тоже сильно повлияет на выбор оптимального способа передачи. 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Valentinych пишет:

Целесообразнее посмотреть в сторону дельта-сигма модуляции (гугл выдаст массу информации). Для передачи сигнала достаточно 1 линии. Плюс линия для синхронизации. И никаких R2R огородов с десятью выходными пинами.

Вообще-то, вопрос в топике задан как-то странно - в шапке речь идет о передаче аналогового сигнала, в тексте - о передаче некоей переменной. Если аналоговый (периодический, непрерывный, длительный...) сигнал - то дельта-сигма, если отдельно взятая переменная - то стандартные процедуры ардуино. Кроме того, если речь идет-таки об аналоговым сигнале, желательно указать его динамический и частотный диапазоны. Это тоже сильно повлияет на выбор оптимального способа передачи. 

щас ( чуть позжее ) ТС прочитает - и офуеет!!!!!

не нано его грузить дельтасигмами ! пусть здеся освоится ллы начала !

std
Offline
Зарегистрирован: 05.01.2012

serginusoid, попробуйте эти способы:

1. по сериалу

Передатчик:

Приёмник:

2. по iic

(резисторы по 4.7k)

Передатчик:

Приёмник:

Архив с либой: https://github.com/madsci1016/Arduino-EasyTransfer

serginusoid
Offline
Зарегистрирован: 19.08.2014

И снова здраствуйте, почти месяц прошел, а я все еще топчусь на том же месте.)) Попытался попробовать все вышеозвученные способы (кроме модуляции, т.к. вообще не в теме). Вообщем все не получалось кроме последнего примера по сериалу(который предложил(а) std) но и с ним не все хорошо. Собственно, с ним я и пытаюсь сейчас работать. Суть в чем: сам пример работает замечательно, но я его немного изменил(в коде Приемника):

01#include <EasyTransfer.h>
02#include <Servo.h>
03 
04Servo myservo;
05 
06struct DATA_STRUCTURE{
07  //структура данных
08  int blinks;
09  int pause;
10 
11};
12 
13EasyTransfer ET;
14 
15DATA_STRUCTURE myData;
16 
17void setup(){
18  pinMode(13, OUTPUT);
19  myservo.attach(8);
20  myservo.write(0);
21   
22  Serial.begin(9600);
23  ET.begin(details(myData), &Serial);
24}
25 
26void loop(){
27  //принято, мигаем
28  if(ET.receiveData()){
29    myservo.write(myData.pause*10);
30    for(int i = 0; i < myData.blinks; i++) {
31      digitalWrite(13, HIGH);
32      delay(myData.pause * 100);
33      digitalWrite(13, LOW);
34      delay(myData.pause * 100);
35    }
36  }
37}

 Итак, надеюсь, идея понятна. Hо при подсоединении к платке Приемника  сервопривода, он(серв), работать не будет потому нет питания, поэтому было логично, по крайней мере для меня питание подключить. И тут начались проблеммы - платка Приемника подключалась через USB порт в результате чего все просто переставало работать(как я думаю, это связано с внутренней логикой контроллера), а в Serial Monitor (Передатчика) вместо нормальных значений появляется абаркадабра какая-то(в коде Передатчика я вставил в loop метод Serial.println(myData.pause) чтобы отслеживать правильность значений). Собственно в чем может быть проблемма?

std
Offline
Зарегистрирован: 05.01.2012

После вызова метода ET.begin() вывод информации в Serial monitor невозможен. Сериал не может одновременно пропускать через себя и отладочную информацию, и трафик EasyTransfer.

Как вариант, можно передавать по i2c. Приём по этой шине должен работать. Пробовался ли этот вариант?

Кстати, существует реализация через программный сериал, называется SoftEasyTransfer. И кстати, скорее всего всё вышеперечисленное вряд-ли нужно. Читайте пример EasyTransfer_2Way_wServo_Example.

serginusoid
Offline
Зарегистрирован: 19.08.2014

Получается, я не могу подключить сериал к связке из двух ардуин? Если так, то как это можно обойти, если это вообще возможно?

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

serginusoid пишет:

Получается, я не могу подключить сериал к связке из двух ардуин? Если так, то как это можно обойти, если это вообще возможно?


Давайте представим сериал как 2 трубы в одну кричишь из другой слушаешь. Пока у вас 2 человека они могут орать и говорить одновременно. Полный дуплекс. А если 3 и все говорят одновременно, то получается фигня и никто не слышит никого.

vvadim
Offline
Зарегистрирован: 23.05.2012

Попробуйте 

A New Software Serial Library for Arduino

Делает ещё один Serial port на двух цифровых выходах

SLOM
Offline
Зарегистрирован: 06.11.2014

подскажите пожалуйста как сделать код под мои нужды: 

 

у меня есть плата в которой спаяны и ардуино и мотор шилд. 

на ней нехватает свободных пинов, для этих целей я хочу управлять ею с другой платы через UART 

вот то что я хочу получить в картинках: 

оно же в расширеной версии. 

 

 

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

все перерыл немогу найти приеру где бы через EasyTransfer или еще как то я мог управлять моторами и сервами одной ардуины через другую с геймпада по блютус, о как :)

 

на данный момент все управление идет через телефон по блютусу, на тирекс контролер

 

в качестве теста, на другой плате использаван вот такой код, управляется с джойсткика 2 сервы: 

код нашел в одной из здешних тем.  

doom369
Offline
Зарегистрирован: 13.05.2015

Если железки подключены к интренету (можно по ЮСБ), то это можно сделать с помощью проекта Blynk. Пример скетча. Геттинг стартет.

SLOM
Offline
Зарегистрирован: 06.11.2014
мне на другом форуме помогли разобраться  с кодом для работы моторов и серв через I2C интерфейс с управлением от блютус джойстика PS2
выкладываю скетчи, может кому то пригодиться.
за основу взят скетч для контролера ТИРЕКС
скачать можно:
 
этот скетч заливается как есть в управляемую ардуину, в моем случае это и есть контролер ТИРЕКС. 
к этой плате присоединяем двигатели(х2) и сервы(х2)
 
соединяем через I2C интерфейс со 2й платой ардуино.(в моем случае нано.) Ардуино нано соединяем с блютус модулем от геймпада. 
и заливаем скетч: 

 

 
 
 
важный момент, при соеденении по И2С шине, на плате тирекс нужно на один из пинов и2с разьема подавать +5в для активации этого соединения, если питание не подать, ничего работать не будет! 
после включения тирекса через сек 10 происходит бип моторам - тирекс готов. после этого можно включать нану, и сразу жать ресет, не знаю почему, если ресет не нажать то соединение не устанавливается.