Arduino Uno + Lcd Keypad + Шаговый двигатель. Не могу подключить, кто может помочь?

MilosAngel
Offline
Зарегистрирован: 01.09.2019

Всем добрый день!)

Не могу подключить всё это (Arduino Uno + Lcd Keypad + Шаговый двигатель) правильно.

Так, как Lcd Keypad ставится сверху Ардуинки, то я запутался в портах, куда и в какие, мне подключать 4 провода от Контроллера?

Может кто сможет помочь, в какие порты назначен контроллер и куда всё подключать?

Код брал с другого ресурса и честно говоря, не сильно в нём разбираюсь. 
Понимание лишь поверхностное, каюсь!

Фото:

 

 

 

 

 

 

 

 

 

 

 

Вот сам код:

 

//  ASTRODUINO - STARTRACKER
//  motorisation d'une "planchette equatoriale" a tige filetée courbée 
//  controle de vitesse du moteur PAP par gestion du delai "microseconde" entre les          fronts montants et descendants
//  compteur de temps de poursuite en utilisant un timer

#include <TimerOne.h>               // librairie pour le timer d'horloge                
#include <LiquidCrystal.h>          // librairie ecran LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);    // declaration des pins utilisées par l'ecran lcd

#define motorPinStep  13   // commande de pas moteur sur pin 13
#define motorPinDir  12    // commande de direction du moteur sur pin 12 

int adc_key_val[5] ={50, 200, 400, 600, 800 };  // valeurs analogiques des boutons
int NUM_KEYS = 5;                               // declaration du nombre de boutons
int adc_key_in;                                 // valeur analogique du bouton appuyé
int key=-1;                                     // 
int isRun;                                      // variable "en marche" ou "arret"

int DelaiPas = 458;        // delai en microsecondes entre chaque pas moteur
int minspeed = 8000;        // delai max pour vitesse minimum

char message[16] = "";      // taille d'une ligne de l'ecran pour affichage de l'horloge
int heures,minutes,secondes;  // variables pour horloge

volatile unsigned long blinkCount = 0; //iterations du timer

/////////////////////////////////////////////////////////////////////////////
void Horloge(void)     // fonction d'interruption timer pour affichage de l'horloge
{

    blinkCount = blinkCount + 1;  // incrementation du timer

// on commence par gérer le temps qui passe...
secondes++;
if(secondes == 60) // une minute est atteinte ?
{
    secondes = 0; // on recompte à partir de 0
    minutes++;
}
if(minutes == 60) // une heure est atteinte ?
{
    minutes = 0;
    heures++;
}
if(heures == 24) // une journée est atteinte ?
{
    heures = 0;
}

  sprintf(message,"%2d:%2d:%2d",heures,minutes,secondes); // formatage de l'horloge
  lcd.setCursor(8,0);           
  lcd.write(message);
}
//////////////////////////////////////////////////////////////////////

void motorrun()   // fonction moteur
{
digitalWrite( 13 , HIGH );
delayMicroseconds( DelaiPas );
digitalWrite( 13 , LOW );
delayMicroseconds( DelaiPas );

}

/////////////////////////////////////////////////////////////////////////////

void setup() {

pinMode( 12 , OUTPUT);  // declaration des broches en sorties
pinMode( 13 , OUTPUT);  //
digitalWrite( 12 , HIGH );  // on fixe le sens de rotation

heures = 0;       //
minutes = 0;      //  initialisation des variables de temps
secondes = 0;     //
Timer1.initialize(1000000);       // initialisation du timer (1000000 de microsecondes = 1        seconde)
Timer1.attachInterrupt(Horloge);  // affectation d'une fonction d'interruption ( quoi faire a chaque interruption du timer)
Timer1.stop();      // on stop le timer pour empecher le debut du compte

lcd.clear();       // efface l'ecran
lcd.begin(16, 2);  // initialise l'ecran
lcd.setCursor(0,0);   // place le curseur au premier caractere de la premiere ligne
lcd.print("***ASTRODUINO***");
lcd.setCursor(0,1);  
lcd.print("**STAR-TRACKER**");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Stopped  0: 0: 0"); 
lcd.setCursor(0,1); 
lcd.print("Delay= "); 
lcd.print(DelaiPas);
lcd.print(" Msec");

isRun = 0;   

}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void loop() {

adc_key_in = analogRead(0);    // lire la valeur du capteur
key = get_key(adc_key_in);  // convertir en " qulle touche a ete appuyée"
if (key >= 0)   // si appui d'une touche detecté..
 {
    if (key == 1) {
                 DelaiPas += 1;
                 delay(150);
                }

  if (key == 2 && DelaiPas > 0) {
                                 DelaiPas -= 1;
                                 delay(150);
                                }

  if (key == 0) {
                 DelaiPas += 10;
                 delay(150);
                }

  if (key == 3) {
                 DelaiPas -= 10;
                 delay(150);
                }

  if (DelaiPas>minspeed) {
                          DelaiPas = minspeed;
                         }

  if (DelaiPas<-minspeed) {
                           DelaiPas = -minspeed;
                          }

  if (key == 4) {        // si touche " select " appuyée > "running" ou "stopped"
                 isRun = 1 - isRun;   // bascule logique > si "marche" alors "arret" et vice   versa
                 lcd.setCursor(0,0); 
                 if (isRun == 1) {
                                  lcd.print("Running");
                                 } else {
                                         lcd.print("Stopped");
                                         Timer1.stop();    // arret du timer (donc de l'horloge) quand  passage de running a stopped
                                        }
                 delay(150);
                }

  lcd.setCursor(0, 1);
  lcd.print("Delay= "); 
  lcd.print(DelaiPas);
  lcd.print(" Msec  ");
  delay(50);

}

if (isRun == 1) {     // si "running"...
               motorrun();         // ... fonction moteur...
               Timer1.resume();        //... reprise de l' horloge 
              }

}

// fonction destinée a savoir quelle touche a ete appuyée
int get_key(unsigned int input)
{
int k;
for (k = 0; k < NUM_KEYS; k++)
  {
   if (input < adc_key_val[k])
        return k;
  }

if (k >= NUM_KEYS)
   k = -1;  // No valid key pressed
   return k;

}

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

А в оригинале (откуда скетч утянут) драйвер шагового двигателя такой как на фото был?

Думаю, что нет. Судя по скетчу, нужен драйвер, управляемый по двум линиям Step и Direction. И эти линии драйвера должны подключаться к 13 и 12 пинам ардуино/шилда (опять же по скетчу).

А у драйвера на фото надо самому в определённом порядке четырьмя его ногами дёргать. Этот скетч такого не делает.

Так что придётся или всё-таки разбираться или воспроизводить оригинальную схему точно.

MilosAngel
Offline
Зарегистрирован: 01.09.2019

kalapanga пишет:

А в оригинале (откуда скетч утянут) драйвер шагового двигателя такой как на фото был?

Думаю, что нет. Судя по скетчу, нужен драйвер, управляемый по двум линиям Step и Direction. И эти линии драйвера должны подключаться к 13 и 12 пинам ардуино/шилда (опять же по скетчу).

А у драйвера на фото надо самому в определённом порядке четырьмя его ногами дёргать. Этот скетч такого не делает.

Так что придётся или всё-таки разбираться или воспроизводить оригинальную схему точно.

 

Да, там драйвер другой :(

А как прикрутить функционал (отображение таймера и задержек) этого скетча к моему шаговому?

Я просто уже столько перелопатил...

Сейчас дам фото с оригинальной статьи, вот:

b707
Offline
Зарегистрирован: 26.05.2017

kalapanga пишет:

Так что придётся или всё-таки разбираться или воспроизводить оригинальную схему точно.

перевожу для ТС, а то боюсь он не поймет: с этим кодом этот драйвер мотора РАБОТАТЬ НЕ БУДЕТ.

Либо меняйтедрайвер, либо переписывайте код.

b707
Offline
Зарегистрирован: 26.05.2017

MilosAngel пишет:

А как прикрутить функционал (отображение таймера и задержек) этого скетча к моему шаговому?

Для вас, думаю, самое простое будет поменять драйвер.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Да, именно так. Купите этот самый "Easy driver" и всё должно заработать. Моторчик, который обычно в комплекте с Вашим драйвером продаётся, скорее всего подойдёт. Так что только плату драйвера заменить.

Хотя за моторчик может и вру. Проверить, кто он там такой не помешает.

MilosAngel
Offline
Зарегистрирован: 01.09.2019

b707 пишет:

MilosAngel пишет:

А как прикрутить функционал (отображение таймера и задержек) этого скетча к моему шаговому?

Для вас, думаю, самое простое будет поменять драйвер.

Вас понял, вот печаль же((

А тут могут помочь с написанием? 

Я честно пытался дважды вникнуть, не выходит.

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вот код второго автора, который работает с моими железяками, так сказать:

 

#include <AccelStepper.h>
#include <LiquidCrystal.h>

#define HALFSTEP 8
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
int adc_key_val[5] ={50, 200, 400, 600, 800 };

// Motor pin definitions
#define motorPin1  3     // IN1 on the ULN2003 driver 1
#define motorPin2  4     // IN2 on the ULN2003 driver 1
#define motorPin3  5     // IN3 on the ULN2003 driver 1
#define motorPin4  6     // IN4 on the ULN2003 driver 1

int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int isRun;
double speeds = 271.6;
int maxspeed = 1245;

AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);

void setup() {
  lcd.clear(); 
  lcd.begin(16, 2);
  lcd.setCursor(0,0); 
  lcd.print("    Stopped     "); 
  lcd.setCursor(0,1); 
  lcd.print("Speed "); 
  lcd.print(speeds);
  lcd.print("   ");
  isRun = 0;

  stepper1.setMaxSpeed(maxspeed);
  stepper1.setSpeed(speeds);
}

void loop() {
  adc_key_in = analogRead(0);    // read the value from the sensor 
  key = get_key(adc_key_in);  // convert into key press
 
  if (key >= 0)   // if keypress is detected
   {
      if (key == 1) {
         speeds += 0.1;
         delay(50);
      }
      if (key == 2 && speeds > 0) {
         speeds -= 0.1;
         delay(50);
      }
      if (key == 0) {
         speeds += 10;
      }
      if (key == 3) {
         speeds -= 10;
      }
      if (speeds>maxspeed) {
         speeds = maxspeed;
      }
      if (speeds<-maxspeed) {
         speeds = -maxspeed;
      }
      if (key == 4) {
        isRun = 1 - isRun;
        lcd.setCursor(0,0); 
        if (isRun == 1) {
          lcd.print("+++ Running +++ ");
        } else {
          lcd.print("    Stopped     "); 
        }
        delay(250);
      }
      lcd.setCursor(0, 1);
      lcd.print("Speed "); 
      lcd.print(speeds);
      lcd.print("       ");
      stepper1.setSpeed(speeds);
      delay(50);
  }
  if (isRun == 1) {
    stepper1.runSpeed();
  }
}

int get_key(unsigned int input)
{
    int k;
    for (k = 0; k < NUM_KEYS; k++)
    {
      if (input < adc_key_val[k])
            return k;
    }
   
    if (k >= NUM_KEYS)
      k = -1;  // No valid key pressed
    return k;
}

 

MilosAngel
Offline
Зарегистрирован: 01.09.2019

Вот две статьи, с которых брал пример, может вам понятнее будет:

 

https://www.thingiverse.com/thing:1719566

https://habr.com/ru/post/227499/
 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Это в разделе "Ищу исполнителя" темку создайте.

Только купить подходящие детали, по-моему, дешевле выйдет :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

MilosAngel пишет:

Не могу подключить всё это (Arduino Uno + Lcd Keypad + Шаговый двигатель) правильно.

Код брал с другого ресурса и честно говоря, не сильно в нём разбираюсь. 
Понимание лишь поверхностное, каюсь!

У тебя есть 3 варианта действий. 

1. Не хочешь разбираца - делай всё как в оригинальном проекте. 

2. Надо изменить первоначальный проект - придется читать книшки и начинать разбираться, спрашивая форум именно по своему коду, а не чужому. 

3. Всё-таки разбираться не хочется, а сделать надо - идти в соотвецтвующий раздел и искать исполнителя за деньги.  Просто так за тебя здесь никто ничо точно делать не будет. 

sadman41
Offline
Зарегистрирован: 19.10.2016

С изидрайвером такой мотор работать не будет, если ему один провод не почикать.

kalapanga
Offline
Зарегистрирован: 23.10.2016

sadman41 пишет:

С изидрайвером такой мотор работать не будет, если ему один провод не почикать.

Точно, он же униполярный там, а Изи биполярными управляет.

MilosAngel
Offline
Зарегистрирован: 01.09.2019

DetSimen пишет:

MilosAngel пишет:

Не могу подключить всё это (Arduino Uno + Lcd Keypad + Шаговый двигатель) правильно.

Код брал с другого ресурса и честно говоря, не сильно в нём разбираюсь. 
Понимание лишь поверхностное, каюсь!

У тебя есть 3 варианта действий. 

1. Не хочешь разбираца - делай всё как в оригинальном проекте. 

2. Надо изменить первоначальный проект - придется читать книшки и начинать разбираться, спрашивая форум именно по своему коду, а не чужому. 

3. Всё-таки разбираться не хочется, а сделать надо - идти в соотвецтвующий раздел и искать исполнителя за деньги.  Просто так за тебя здесь никто ничо точно делать не будет. 

 

В общем, проблема решена, код на писан и даже меню есть)))
Если что, пусть нуждающиеся обращаются!) 

Elektron777
Offline
Зарегистрирован: 16.08.2020

Здравствуйте! Собираю такой же аатротрэкер на этом же наборе железок. Не поделитесь вашим скетчем?

MilosAngel
Offline
Зарегистрирован: 01.09.2019

Конечно поделюсь, мне не сложно!

Как вам его передать?