roboforum.ru

Технический форум по робототехнике.

Проблема с приёмом аналоговых сигналов на Arduino...

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Проблема с приёмом аналоговых сигналов на Arduino...

Сообщение GlassEagle » 02 окт 2011, 00:47

и вообще на AVR (конкретно, ATmega8).

Решил снять сигнал обратной связи с сервиного потенциометра и посмотреть, как его можно в дуне использовать. Набросал такой вот скотч:
Код: Выделить всёРазвернуть
#include <Servo.h>

const int ServoPin=4,  // Digital pin for servo impulses
  ServoFBpin=5,        // Analog pin for servo potentiometer reading
  A0pin=0;             // Analog pin for control potentiometer

int pos=1500;  // Servo position
int pot0=0,  // Previous servo potentiometer signal
  pot1,pot2,pot3,  // Samples of servo potentiometer signal
  pot;       // Current servo potentiometer signal
int A0pot,
  A0pot1,A0pot2,A0pot3,  // Samples of input signal
  A0pot0;  // Signal at previous iteration
int delta=3;  // Difference between current and previous control potentiometer signal
int dpot=6;   // Difference between current and previous servo potentiometer signal

const int usCenter=1500;  // Servo signal durations
const int usLeft=2500;  //2000;
const int usRight=0;    //1000;

Servo s1;

void setup()
{
  s1.attach(ServoPin);
  Serial.begin(9600);
}

void loop()
{
  A0pot1=analogRead(A0pin);  // State of control potentiometer
  A0pot2=analogRead(A0pin);  // State of control potentiometer
  A0pot3=analogRead(A0pin);  // State of control potentiometer
  A0pot=(A0pot1+A0pot2+A0pot3)/3;
  if(abs(A0pot-A0pot0)>delta)
  {
    pos=usRight+((float(usLeft-usRight)*float(A0pot))/1023.);  // New position of servo
    s1.writeMicroseconds(pos);
    delay(19);
    pot3=analogRead(ServoFBpin)>>1;  // State of servo potentiometer
    pot1=analogRead(ServoFBpin)>>1;  // State of servo potentiometer
    pot2=analogRead(ServoFBpin)>>1;  // State of servo potentiometer
    pot=(pot1+pot2+pot3)/3;
    if(abs(pot-pot0)>dpot)
      Serial.println(pot,DEC);
  }
  A0pot0=A0pot;
  pot0=pot;
}

>>1 - это деление на два.
Серва управляется с отдельного потенциометра, подключённого к аналоговому входу 0.
Сигнал с потенциометра сервы заводится на аналоговый вход 5.
В-общем, всё работает, все довольны, все смеются, НО... если отсоединить (физически) сигнал от входа А5 и крутить управляющий потециометр на А0, то Serial.print всё равно показывает наличие сигнала (т.е. меняется значение переменной pot). Это как??? Причём меняется вполне адекватно вращению потенциометра (конкретно, между ~500 и 0) (когда потенциометр сервы подключен, то диапазон получается от ~55 до ~250).

УжЕ весь атмеловский даташит про аналоговые входы 2 раза прочитал - ничё понять не могу (не в даташите, а в этом явлении). Либо где-то чёта в коде накосячил так, что сам не пойму, либо одно из двух.
Конечно, если это явление нормальное и обычное - то чёрт с ним, но выглядит, как сильная наводка с одного аналогового входа на другой (мега погорела?).
Уже и ардуиновский исходник функции analogRead смотрел, вроде нет там криминала.
(Питание у сервы и МК, само собой, отдельное.)
Когда я слышу слова "Первый закон робототехники", я вспоминаю анекдот про ноусэров.
GlassEagle
 
Сообщения: 160
Зарегистрирован: 14 окт 2009, 11:46
Откуда: Самара

Re: Проблема с приёмом аналоговых сигналов на Arduino...

Сообщение Grem » 02 окт 2011, 02:38

В-общем, всё работает, все довольны, все смеются, НО... если отсоединить (физически) сигнал от входа А5 и крутить управляющий потециометр на А0, то Serial.print всё равно показывает наличие сигнала

Конечно, он и будет, но абсолютно случайный. Подтяните на землю и будет 0 :)
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Аватара пользователя
Grem
 
Сообщения: 1530
Зарегистрирован: 16 май 2009, 12:50
Откуда: Россия
прог. языки: Java, C

Re: Проблема с приёмом аналоговых сигналов на Arduino...

Сообщение Duhas » 02 окт 2011, 08:43

со схемой было бы проще, имхо.
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Проблема с приёмом аналоговых сигналов на Arduino...

Сообщение boez » 02 окт 2011, 11:13

+1 - попробуй на землю закоротить.
Есть подозрение, что это sample-hold АЦПшный дает такое интересное явление. Ведь что такое по сути sample-hold? Аналоговый коммутатор (мультиплаксор) и конденсатор небольшой емкости после него. Коммутатор подключает на короткое время нужный вход (в соответствии с ADMUX) к конденсатору и заряжает его напряжением входа. Потом отключает и АЦП меряет напряжение на конденсаторе. А если вход никуда не подключен? А тогда на конденсаторе останется значение с предыдущего входа :)
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Проблема с приёмом аналоговых сигналов на Arduino...

Сообщение GlassEagle » 02 окт 2011, 14:36

Grem писал(а):Конечно, он и будет, но абсолютно случайный.
Он не случайный (случайный бы не вызвал вопросов, всё было бы понятно), он
меняется вполне адекватно вращению потенциометра (конкретно, между ~500 и 0)

Grem писал(а):Подтяните на землю и будет 0 :)
Ок, попробую!

boez писал(а):...А если вход никуда не подключен? А тогда на конденсаторе останется значение с предыдущего входа :)
Да, это похоже. Спасибо!

Добавлено спустя 56 минут 33 секунды:
Duhas писал(а):со схемой было бы проще, имхо.
Arduino+Servo.png
Так лучше?
Когда я слышу слова "Первый закон робототехники", я вспоминаю анекдот про ноусэров.
GlassEagle
 
Сообщения: 160
Зарегистрирован: 14 окт 2009, 11:46
Откуда: Самара


Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron