Arduino Uno + Lcd Keypad + Шаговый двигатель. Не могу подключить, кто может помочь?
- Войдите на сайт для отправки комментариев
Пнд, 02/09/2019 - 13:21
Всем добрый день!)
Не могу подключить всё это (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;
}

А в оригинале (откуда скетч утянут) драйвер шагового двигателя такой как на фото был?
Думаю, что нет. Судя по скетчу, нужен драйвер, управляемый по двум линиям Step и Direction. И эти линии драйвера должны подключаться к 13 и 12 пинам ардуино/шилда (опять же по скетчу).
А у драйвера на фото надо самому в определённом порядке четырьмя его ногами дёргать. Этот скетч такого не делает.
Так что придётся или всё-таки разбираться или воспроизводить оригинальную схему точно.
А в оригинале (откуда скетч утянут) драйвер шагового двигателя такой как на фото был?
Думаю, что нет. Судя по скетчу, нужен драйвер, управляемый по двум линиям Step и Direction. И эти линии драйвера должны подключаться к 13 и 12 пинам ардуино/шилда (опять же по скетчу).
А у драйвера на фото надо самому в определённом порядке четырьмя его ногами дёргать. Этот скетч такого не делает.
Так что придётся или всё-таки разбираться или воспроизводить оригинальную схему точно.
Да, там драйвер другой :(
А как прикрутить функционал (отображение таймера и задержек) этого скетча к моему шаговому?
Я просто уже столько перелопатил...
Сейчас дам фото с оригинальной статьи, вот:

Так что придётся или всё-таки разбираться или воспроизводить оригинальную схему точно.
перевожу для ТС, а то боюсь он не поймет: с этим кодом этот драйвер мотора РАБОТАТЬ НЕ БУДЕТ.
Либо меняйтедрайвер, либо переписывайте код.
А как прикрутить функционал (отображение таймера и задержек) этого скетча к моему шаговому?
Для вас, думаю, самое простое будет поменять драйвер.
Да, именно так. Купите этот самый "Easy driver" и всё должно заработать. Моторчик, который обычно в комплекте с Вашим драйвером продаётся, скорее всего подойдёт. Так что только плату драйвера заменить.
Хотя за моторчик может и вру. Проверить, кто он там такой не помешает.
А как прикрутить функционал (отображение таймера и задержек) этого скетча к моему шаговому?
Для вас, думаю, самое простое будет поменять драйвер.
Вас понял, вот печаль же((
А тут могут помочь с написанием?
Я честно пытался дважды вникнуть, не выходит.
Или, к примеру, есть очень даже рабочий код с моим контроллером, даже проверял, но опять же, там выражено не в задержке(как выше на экране), а в скорости вращения, а я тупо не могу найти как высчитать под мои параметры эту скорость.
Вот код второго автора, который работает с моими железяками, так сказать:
#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; }Вот две статьи, с которых брал пример, может вам понятнее будет:
https://www.thingiverse.com/thing:1719566
https://habr.com/ru/post/227499/
Это в разделе "Ищу исполнителя" темку создайте.
Только купить подходящие детали, по-моему, дешевле выйдет :)
Не могу подключить всё это (Arduino Uno + Lcd Keypad + Шаговый двигатель) правильно.
Код брал с другого ресурса и честно говоря, не сильно в нём разбираюсь.
Понимание лишь поверхностное, каюсь!
У тебя есть 3 варианта действий.
1. Не хочешь разбираца - делай всё как в оригинальном проекте.
2. Надо изменить первоначальный проект - придется читать книшки и начинать разбираться, спрашивая форум именно по своему коду, а не чужому.
3. Всё-таки разбираться не хочется, а сделать надо - идти в соотвецтвующий раздел и искать исполнителя за деньги. Просто так за тебя здесь никто ничо точно делать не будет.
С изидрайвером такой мотор работать не будет, если ему один провод не почикать.
С изидрайвером такой мотор работать не будет, если ему один провод не почикать.
Точно, он же униполярный там, а Изи биполярными управляет.
Не могу подключить всё это (Arduino Uno + Lcd Keypad + Шаговый двигатель) правильно.
Код брал с другого ресурса и честно говоря, не сильно в нём разбираюсь.
Понимание лишь поверхностное, каюсь!
У тебя есть 3 варианта действий.
1. Не хочешь разбираца - делай всё как в оригинальном проекте.
2. Надо изменить первоначальный проект - придется читать книшки и начинать разбираться, спрашивая форум именно по своему коду, а не чужому.
3. Всё-таки разбираться не хочется, а сделать надо - идти в соотвецтвующий раздел и искать исполнителя за деньги. Просто так за тебя здесь никто ничо точно делать не будет.
В общем, проблема решена, код на писан и даже меню есть)))
Если что, пусть нуждающиеся обращаются!)
Здравствуйте! Собираю такой же аатротрэкер на этом же наборе железок. Не поделитесь вашим скетчем?
Конечно поделюсь, мне не сложно!
Как вам его передать?