Киевский клуб любителей астрономии "Астрополис"

astromagazin.net
* *
Ласкаво просимо, Гість. Будь ласка, увійдіть або зареєструйтеся.
16 Грудня 2019, 04:03:21

Увійти

google


Автор Тема: И снова Arduino :-)))  (Прочитано 6784 раз)

0 Користувачів і 1 Гість дивляться цю тему.

M_M

  • Клуб Астрополис
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1093
Re: И снова Arduino :-)))
« Reply #40 : 06 Травня 2015, 23:58:43 »
. - .

Со страницы arduino.ua:

Цитувати
Напряжение питания (рекомендуемое)   7-12В
Напряжение питания (предельное)   6-20В
Но поскольку там обычно 16-ти вольтовый конденсатор стоит по входу (это видно на вышеприведенной картинке) , больше 15 я бы давать не стал.  7.5 вольт питания - нормально.
UPD


В оригинале стоят 25 вольт конденсаторы  ;D
« Останнє редагування: 07 Травня 2015, 00:02:59 від M_M »
Записаний

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 252
  • Ищи на третьей планете.
    • Project EQDrive
Re: И снова Arduino :-)))
« Reply #41 : 27 Травня 2015, 13:41:35 »
. - .

Думаю начинающим будет интересно прочитать http://robocraft.ru/files/books/arduino_notebook_rus_v1-1.pdf
Записаний


Подякували

LifeIsGood

  • Клуб Астрополис, Модератор
  • Offline Offline
  • Повідомлень: 5163
  • Подяк: 384
Re: И снова Arduino :-)))
« Reply #42 : 27 Травня 2015, 14:39:34 »
. - .

Записаний

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 252
  • Ищи на третьей планете.
    • Project EQDrive
Re: И снова Arduino :-)))
« Reply #43 : 08 Червня 2015, 13:35:52 »
. - .

Так как сей пульт (для EQDrive Standard/Standard2) что на фото ушел к хорошему человеку  ;D решил сделать аля аналог на ардуино.


Маловат конечно АЦП всего 10 бит.
библ TimerOne.h в архиве.

Код: [Select]
#include <TimerOne.h>

#define joystickPin_X  0
#define joystickPin_Y  1
#define buttonPin 2
#define LedPin  13

#define READ_X  analogRead(joystickPin_X)
#define READ_Y  analogRead(joystickPin_Y)

#define READ_BUTTON  digitalRead(buttonPin)
#define ON  LOW
#define OFF  HIGH

#define LED_ON  digitalWrite(LedPin, HIGH)
#define LED_OFF  digitalWrite(LedPin, LOW)

int ADC_max = 1024;
int ADC_min = 0;

int hysteresis = 100;

struct Axis
{
  long  Value;
  long  Zero;
  long  Old;
  double Speed;
};
struct Axis X;
struct Axis Y;

long  max_speed = 800;

double SiderealSpeed = 15.041068;
double LunarSpeed = 14.511415;
double SolarSpeed = 15.0;

enum tracking {star, moon, sun, stopTrack, error_J};

int Tracking_Mode;
int counter_tim = 0;

void setup()
{
  delay(100);
  analogReference(DEFAULT);
  Serial.begin(9600);
 
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  pinMode(LedPin, OUTPUT);
  LED_OFF ;

  if(Joystick_offset())
  {
    Tracking_Mode = stopTrack;
    Timer1.initialize(100000);
    Timer1.attachInterrupt(EventTimer); // run every 100 ms
  }
  else
    Tracking_Mode = error_J;
}

void loop()
{
  switch (Tracking_Mode)
  {
    case star:
    {
      LED_ON;
      delay(500);
      LED_OFF;
      delay(500);
      break;
    }
    case stopTrack:
    {
      LED_ON;
      break;
    }
    case error_J:
    {
      LED_ON;
      delay(50);
      LED_OFF;
      delay(50);
      break;
    }
  }


}

void EventTimer()
{
  if(READ_BUTTON == ON)
  {
    if(++counter_tim > 10) //1000ms
    {
      counter_tim = 0;
      switch(Tracking_Mode)
      {
        case stopTrack:
        {
          Tracking_Mode = star;
          max_speed = 100;
          Serial.print("HC>EQD: Speed1 ");
          Serial.print(SiderealSpeed, 7);
          Serial.println('\r');
          break;
        }
       
        case star:
        {
          Tracking_Mode = stopTrack;
          max_speed = 800;
          Serial.print("HC>EQD: Speed 0.0 0.0");
          Serial.println('\r');
          break;
        }
      }
     
      return;
    }
  }
 
  X.Value = READ_X;
  Y.Value = READ_Y;

  if (X.Value == X.Old && Y.Value == Y.Old) return;
  X.Old = X.Value;
  Y.Old = Y.Value;
 
  calc_speed(&X);
  calc_speed(&Y);
 
  TrackingRate();
}

void TrackingRate()
{
  switch(Tracking_Mode)
  {
    case star:
    {
      if ( X.Speed == 0.0)  X.Speed = SiderealSpeed;
      break;
    }
   
    case stopTrack:
    break;
  }
 
  Serial.print("HC>EQD: Speed "); Serial.print(X.Speed, 7);
  Serial.print(" ");
  Serial.print(Y.Speed, 7);
  Serial.println('\r');

}

void calc_speed(struct Axis* pA)
{
  pA->Speed = 0.0;
 
  if (pA->Value > pA->Zero) // ADC value > 512
  {
    if((pA->Value -= hysteresis) < pA->Zero)return ;
    pA->Speed = map(pA->Value, pA->Zero, 1023, 0, max_speed);
  }
  else // ADC value < 512
  {
    if((pA->Value += hysteresis) > pA->Zero)return;
    pA->Speed = map(pA->Value, pA->Zero, 0, 0, -max_speed);
  }

  pA->Speed *= SiderealSpeed;
}

boolean Joystick_offset()
{
  X.Zero = READ_X;
  Y.Zero = READ_Y;
 
  if(X.Zero < 512 - hysteresis || X.Zero > 512 + hysteresis ||
    Y.Zero < 512 - hysteresis || Y.Zero > 512 + hysteresis)
    return false;
  return true;
}
« Останнє редагування: 08 Червня 2015, 20:00:51 від MAKsutik »
Записаний



Yvk

  • Клуб Астрополис
  • Offline Offline
  • Повідомлень: 4562
  • Подяк: 313
    • Не адмін на деякий час
Re: И снова Arduino :-)))
« Reply #44 : 16 Червня 2015, 15:23:00 »
. - .

Обсуждение про подключение оптрона уехало туда:
http://www.astroclub.kiev.ua/forum/index.php?topic=1467.msg481901#msg481901
Записаний
Подякували

vakulenko

  • Offline Offline
  • Повідомлень: 1074
  • Подяк: 116
  • Антон Вакуленко
Re: И снова Arduino :-)))
« Reply #45 : 02 Липня 2015, 10:24:16 »
. - .

Вопрос про ардуину, поэтому влезу в чужую тему )

Собственно вопрос по чтению напряжения с аналоговых ног (read analog voltage)
https://www.arduino.cc/en/Tutorial/ReadAnalogVoltage

Я так понимаю, что точность измерения напрямую зависит от соответствия напряжения на ноге "+5В" этим самым 5 вольтам. То есть, если питание идет от батареек и напряжение на контакте +5В в процессе эксплуатации меняется, то и точность измерения также будет колебаться?

Или оно там все равно как-то стабилизируется?
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 252
  • Ищи на третьей планете.
    • Project EQDrive
Re: И снова Arduino :-)))
« Reply #46 : 02 Липня 2015, 10:35:15 »
. - .

В зависимости от выбранного режима АЦП


    DEFAULT: стандартное опорное напряжение 5 В (на платформах с напряжением питания 5 В) или 3.3 В (на платформах с напряжением питания 3.3 В)
    INTERNAL: встроенное опорное напряжение 1.1 В на микроконтроллерах ATmega168 и ATmega328, и 2.56 В на ATmega8.
    EXTERNAL: внешний источник опорного напряжения, подключенный к выводу AREF

http://arduino.ru/Reference/AnalogReference
Записаний


Подякували


M_M

  • Клуб Астрополис
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1093
Re: И снова Arduino :-)))
« Reply #47 : 02 Липня 2015, 11:12:31 »
. - .


Я так понимаю, что точность измерения напрямую зависит от соответствия напряжения на ноге "+5В" этим самым 5 вольтам. То есть, если питание идет от батареек и напряжение на контакте +5В в процессе эксплуатации меняется, то и точность измерения также будет колебаться?


В зависимости от того, что надо измерить. Если нужно измерить напряжение на потенциометре, подключенному к этим же плавающим 5 вольт, то точность не меняется. Измерение в попугаях. Один попугай = 1/1024 опорного напряжения. При максимальном значении 1023. Т.е. попугай (он же абсолютная точность в первом приближении) зависит от опорного напряжения. Чем меньше опорное - тем выше точность. Но увлекаться снижением опорного напряжения не стоит. Ибо при низких значениях опорного напряжения начинают сказываться шумы и неизбежные дефекты производства кристаллов.
Записаний
Подякували

exez

  • Клуб Астрополис
  • Offline Offline
  • Повідомлень: 1820
  • Подяк: 597
  • Астроманьяк
Re: И снова Arduino :-)))
« Reply #48 : 20 Липня 2015, 20:45:33 »
. - .

Побаловавшись с контролерами захотелось объединить парочку.. Как же это лучше сделать как ни попробовать радиомодельку. Не долго думая взял с ребенком Лего и вперед! Компоненты:

Лего :)
DC 12V
Step Motor 28BYJ-48 -- 5V модернизирован в биполярный, впоследствии поменяю на сервопривод
Два контроллера ардуино: Nano для пульта и UnoR3 для машинки
Драйвер управления шаговыми двигателями на базе L293.
Радиомодули прием\передача RF433.
Элементы питания

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





видео:
http://www.fayloobmennik.net/5327967

Собственно ВОПРОС
В общем возникла проблема с программной частью. Если в части Ресивера
void MotorForward()
{
  motor.run(FORWARD); delay(1000);
}

поставить Делай меньше, то машина едет с рывками. Если оставить как есть - получается что мотор едет минимум 1 секунду. Это не подходит для маневров.. Эли переделать прогу, поставить меньше тут делай, а внизу убрать

    if (Res1 == 69 || Res1 == 70 || Res1 == 0)
    {
      if (aa<5) {aa++; Serial.println(aa); return; }
      else {aa = 0; Serial.println(aa); MotorStop(); Res1=0;}   

то получится при потере радиосигнала машинка будет ехать пока не упрется..

Что касается одновременного поворота передней оси и движения вперед\назад, я тут пока вобще не копал..

В коде скорее всего много лишнего и уверен еще больше недописанного. Пинайте. Я же учусь! Буду признателен за помощь!

Чем прошивал мозги:

Пульт. Он же Transmitter:

  // transmitter

#include <VirtualWire.h>

int indi;    // диод индикатор
int button10 = 10;

int vrx;
int vry;

int spd;       // разгон


// (vrx < 465) // RIGHT
void TurnLeft()
{
    indi++; if (indi>1){digitalWrite(13,HIGH);} if (indi>2){digitalWrite(13, LOW); indi=0;}

    const char *msg = "A"; //65
    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);

Serial.println("Sending A");

}


// (vrx > 565) // LEFT
void TurnRight()
{
    indi++; if (indi>1){digitalWrite(13,HIGH);} if (indi>2){digitalWrite(13, LOW); indi=0;}

    const char *msg = "B"; //66
    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);

Serial.println("Sending B");

}


// (vry > 550)  // FORWARD
void MotorForward()
{
    indi++; if (indi>1){digitalWrite(13,HIGH);} if (indi>2){digitalWrite(13, LOW); indi=0;}

    const char *msg = "C"; //67
    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);

Serial.println("Sending C");

}

// (vry < 550)  // BACKWARD
void MotorBackward()
{
    indi++; if (indi<30) {digitalWrite(13,LOW);} if (indi>1){digitalWrite(13,HIGH);} if (indi>2){digitalWrite(13, LOW); indi=0;}

    const char *msg = "D"; //68
    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);

Serial.println("Sending D");
}

void MotorStop()
{
    indi++; if (indi<30) {digitalWrite(13,LOW);} if (indi>1){digitalWrite(13,HIGH);} if (indi>2){digitalWrite(13, LOW); indi=0;}

    const char *msg = "E"; //69
    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);

Serial.println("Sending E");
}

void TurnStop()
{

    indi++; if (indi<30) {digitalWrite(13,LOW);} if (indi>1){digitalWrite(13,HIGH);} if (indi>2){digitalWrite(13, LOW); indi=0;}

    const char *msg = "F"; //70
    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);

Serial.println("Sending F");
}



void setup()
{
    pinMode(10,INPUT_PULLUP);
    pinMode(13,INPUT_PULLUP);   
    Serial.begin(9600);   // Debugging only
    Serial.println("Sending..");
    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);      // Bits per sec
}

void loop()
{
    if (digitalRead(10)==LOW)
    {
    const char *msg = "0"; //65
    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);
//    delay(200);
    }
   
    else
   
vrx=analogRead(0);
vry=analogRead(1);

  if (vrx<465)
  {
   
    TurnRight(); //delay(200);
//  Serial.println("right");
  }
  else
 
  if (vrx>565)
  {
   
    TurnLeft(); //delay(200);
//  Serial.println("left");
 
  }
  else
 
  if (vry<450)
  {
   
    MotorBackward(); //delay(200);
//    Serial.println("fw");
  }
  else
 
  if (vry>550)
  {
   
    MotorForward(); //delay(200);
//  Serial.println("bw");
  }

  if (vry>450&&vry<550) 
  {
 
    MotorStop(); //delay(200);
  }

  if (vrx>4465&&vrx<565) 
  {
 
    TurnStop(); //delay(200);
  }

   
    else {}
   
//    Serial.println(vrx);
}


Машинка. Она же Reciever:


  // receiver

#include <VirtualWire.h>
#include <AFMotor.h>
 
AF_DCMotor motor(4, MOTOR34_1KHZ); // create motor #2, 64KHz pwm MOTOR12_64KHZ MOTOR34_8KHZ
AF_Stepper motorA(48, 1);

int Res1;
int aa;

void TurnLeft()
{
  motorA.step(20, BACKWARD, DOUBLE);
}

void TurnRight()
{
  motorA.step(20, FORWARD, DOUBLE); 
}

void MotorForward()
{
  motor.run(FORWARD); delay(1000);
}

void MotorBackward()
{
  motor.run(BACKWARD); delay(1000);     // the other way
}

void MotorStop()
{
  motor.run(RELEASE);
}

void TurnStop()
{
}


void setup()
{
    Serial.begin(9600); // Debugging only
    Serial.println("Receive..");

    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);      // Bits per sec
    vw_set_rx_pin(2);   

    vw_rx_start();       // Start the receiver PLL running
   
    motor.setSpeed(255); 
    motorA.setSpeed(200);
}

void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

retry:
    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
        int i;
        digitalWrite(13, true); // Flash a light to show received good message
        // Message with a good checksum received, dump it.
        Serial.print("Got: ");       
        for (i = 0; i < buflen; i++)
        {
            Serial.print(buf);
            Serial.print(" ");
            Res1 = buf;
        }
        Serial.println("");
        digitalWrite(13, false);
    }
   
if (Res1 != 0 && aa > 0 && aa < 5 && Res1 != 69 && Res1 != 70)     {aa = 0;}

//  motor.run(FORWARD); delay(200);
//  motor.run(RELEASE);   delay(200000);

//    if (Res1 == 0)
//    {TurnStop(); MotorStop();}

    if (Res1 == 65)
    {Serial.println("B"); TurnLeft(); Res1=0;}
   
    if (Res1 == 66)
    {Serial.println("A"); TurnRight(); Res1=0;}

    if (Res1 == 67)
    {Serial.println("D"); MotorBackward(); Res1=0;}

    if (Res1 == 68)
    {Serial.println("C"); MotorForward(); Res1=0;}
       
    if (Res1 == 69 || Res1 == 70 || Res1 == 0)
    {
      if (aa<5) {aa++; Serial.println(aa); return; }
      else {aa = 0; Serial.println(aa); MotorStop(); Res1=0;}   
    }

//    digitalWrite(13, HIGH); delay(550); digitalWrite(13, LOW); delay(150);
}
Записаний
чистого всем неба и длинных безлунных ночей...

alex~

  • Offline Offline
  • Повідомлень: 5895
  • Подяк: 199
Re: И снова Arduino :-)))
« Reply #49 : 20 Липня 2015, 22:17:02 »
. - .

имхо:
- при движении машинки никаких delay() не нужно.
- нажали кнопку "вперед", выдали команду motor.run(FORWARD) и забыли.
- машинка едет вперед... до тех пор пока не поступит команда motor.stop()

чтобы машинка остановилась при потере сигнала:
- пусть передатчик в фоне шлет каждую секунду какие-нибудь NOOP`ы
- на приемнике: если NOOP`ов долго нету, то дать команду motor.AllStop()
Записаний
Подякували

exez

  • Клуб Астрополис
  • Offline Offline
  • Повідомлень: 1820
  • Подяк: 597
  • Астроманьяк
Re: И снова Arduino :-)))
« Reply #50 : 20 Липня 2015, 23:05:19 »
. - .

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

kellkinel

  • Клуб Астрополис
  • Offline Offline
  • Повідомлень: 213
  • Подяк: 45
  • Дмитрий
Re: И снова Arduino :-)))
« Reply #51 : 11 Жовтня 2015, 00:03:57 »
. - .

Ищу программиста на Arduino, нужно написать несколько скетчей. Готов оплатить данную услугу. Подробности в личку
Записаний
GSO 203/800 f/4, EQ-5M, Canon 650d, CAM10, CAM8 - на подходе))

M_M

  • Клуб Астрополис
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1093
Re: И снова Arduino :-)))
« Reply #52 : 11 Жовтня 2015, 00:46:41 »
. - .

kellkinel, кидайте задачи сюда.
Записаний

kellkinel

  • Клуб Астрополис
  • Offline Offline
  • Повідомлень: 213
  • Подяк: 45
  • Дмитрий
Re: И снова Arduino :-)))
« Reply #53 : 11 Жовтня 2015, 10:35:29 »
. - .

kellkinel, кидайте задачи сюда.
отписался в личку :)
Записаний
GSO 203/800 f/4, EQ-5M, Canon 650d, CAM10, CAM8 - на подходе))

malex

  • Offline Offline
  • Повідомлень: 598
  • Подяк: 457
Re: И снова Arduino :-)))
« Reply #54 : 29 Жовтня 2015, 22:46:57 »
. - .

Люди, подскажите. Как на ардуино инициализировать таймер, не используя никаких библиотек, а только используя регистры TCCRxA, TCCRxB, ну и естественно OCRxA, OCRxB.
Спасибо.
Записаний
... Если все открыть пути, куда идти и с кем идти,
и как бы ты тогда нашел свой путь ...
А. Макаревич

alex~

  • Offline Offline
  • Повідомлень: 5895
  • Подяк: 199
Re: И снова Arduino :-)))
« Reply #55 : 29 Жовтня 2015, 22:54:47 »
. - .

Что-то вроде этого:
Код: [Select]
  // инициализация Таймера/Счетчика №1
  TCCR1A=0x00;
  TCCR1B=0x0C;  // clkI/O/256     
  // инициируем сам счетчик
  OCR1A = 3630; 
 
  // разрешаем прерывания для Таймера/Счетчика №1
  TIMSK=0x10;   // режим: Clear Timer on Compare Match (CTC)

правда программировал не в среде Ардуино, но суть от этого не меняется
Записаний
Подякували

malex

  • Offline Offline
  • Повідомлень: 598
  • Подяк: 457
Re: И снова Arduino :-)))
« Reply #56 : 29 Жовтня 2015, 23:08:03 »
. - .

Спасибо. Значит буду искать у себя ошибку. А то вот попробовал, выше описанным способом, запустить таймер в режиме генерации импульсов на выводе OC1A, не пошло.  :beer:
Записаний
... Если все открыть пути, куда идти и с кем идти,
и как бы ты тогда нашел свой путь ...
А. Макаревич

M_M

  • Клуб Астрополис
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1093
Re: И снова Arduino :-)))
« Reply #57 : 29 Жовтня 2015, 23:49:59 »
. - .

Библиотеки с исходным кодом, можно подсмотреть   :shuffle:
Записаний

malex

  • Offline Offline
  • Повідомлень: 598
  • Подяк: 457
Re: И снова Arduino :-)))
« Reply #58 : 29 Жовтня 2015, 23:59:34 »
. - .

Библиотеки с исходным кодом, можно подсмотреть   :shuffle:

Если это был вопрос - можно ли посмотреть мой код, то смотреть там нечего. Было как у alex, только цифры другие.
Типа так:
TCCR1A=0x40;
TCCR1B=0x0D;
OCR1A=0x3D09;


Да... Среда ардуино, при компиляции, ругается на TIMSK:

sketch_oct29a.ino:10:3: error: 'TIMSK' was not declared in this scope
 :hz:
Записаний
... Если все открыть пути, куда идти и с кем идти,
и как бы ты тогда нашел свой путь ...
А. Макаревич

M_M

  • Клуб Астрополис
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1093
Re: И снова Arduino :-)))
« Reply #59 : 30 Жовтня 2015, 00:24:10 »
. - .

Это не вопрос.

Ругается: сообщает, что не знает, что такое TIMSK. Обычно это случается если забыли включить какой-то header.

Нужно что-то такое
Код: [Select]
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "Arduino.h"
#include "pins_arduino.h"
Записаний