Решил снять сигнал обратной связи с сервиного потенциометра и посмотреть, как его можно в дуне использовать. Набросал такой вот скотч:
- Код: Выделить всё
#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 смотрел, вроде нет там криминала.
(Питание у сервы и МК, само собой, отдельное.)