Touchscreen + Motor Shield

Otheral
Offline
Зарегистрирован: 22.10.2012

Есть в наличии touchscreen TFT 2.8" LCD Touch Shield V1.0 ITEAD STUDIO, FREEDUINO MOTORSHIELD v3 и Arduino Mega 2560 rev 3.

Библиотека для экрана исправлена как написано тут http://arduino.ru/forum/apparatnye-voprosy/raznitsa-pri-podklyuchenii-tft-k-leonardo-i-mega-2560, экран работает. Сделано меню, в котором указывается скорость вращения, усилие и количество оборотов, работает как при прямом подключении к ардуино, так и при подключении через моторшилд.

При загрузке тестового скетча для шагового двигателя движок крутится нормально.

При загрузке скетча меню меню работает нормально.

При попытке загрузить обьедененный работает только меню(даже если удалить все из loop оставив только демокод шаговика).

Подскажите, в чем может быть проблема?

 

#include <UTFT.h>
#include <UTouch.h>
#include <AFMotorSPI.h>

// Declare which fonts we will be using
extern uint8_t BigFont[];

// Uncomment the next two lines for the Arduino 2009/UNO
//UTFT        myGLCD(ITDB24D,19,18,17,16);   // Remember to change the model parameter to suit your display module!
//UTouch      myTouch(15,10,14,9,8);

// Uncomment the next two lines for the Arduino Mega
UTFT myGLCD(ILI9325D_8,A5,A4,A3,A2);
UTouch      myTouch(A1,A2,A0,8,9);

int x, y, a, b, c, h, t, p, h1, t1,m;
int Vib = A13;
int Aud = A15;
AF_Stepper motor(48, 2);
/*************************
**   Custom functions   **
*************************/

void drawSettings()
{
// Основное меню 
// Рисуется верхняя кнопка
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (5, 5, 310, 120);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (5, 5, 310, 120);
  myGLCD.print("SETTINGS", 90, 60);
}
void drawStart()
{// Рисуется нижняя кнопка
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (5, 130, 310, 240);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (5, 130, 310, 240);
  myGLCD.print("START", 115, 180);
}
void drawProcess()
{// Рисуется PROCESS
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (70, 70, 245, 170);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (70, 70, 245, 170);
  myGLCD.print("PROCESS", 100, 112);
}

void secMenu11()
{
// Меню настроек
// Рисуется левая кнопка скорости
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (5, 5, 65, 60);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (5, 5, 65, 60);
  myGLCD.print("<-", 20, 25);
}
void secMenu12()
{
  // Рисуется скорость 
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (70, 5, 170, 60);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (70, 5, 170, 60);
  myGLCD.print("Speed", 80, 25);
}
void secMenu13()
{
  // Рисуется правая кнопка скорости
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (175, 5, 235, 60);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (175, 5, 235, 60);
  myGLCD.print("->", 190, 25);
}
void secMenu14()
{
  // Рисуется значение скорости
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (240, 5, 310, 60);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (240, 5, 310, 60);
  myGLCD.printNumI(a, 252, 25);
}  

void secMenu21()
{
// Усилие
// Рисуется левая кнопка усилия
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (5, 65, 65, 120);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (5, 65, 65, 120);
  myGLCD.print("<-", 20, 85);
}
void secMenu22()
{
  // Рисуется Усилие
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (70, 65, 170, 120);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (70, 65, 170, 120);
  myGLCD.print("Force", 80, 85);
}
void secMenu23()
{
  // Рисуется значение усилия
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (175, 65, 235, 120);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (175, 65, 235, 120);
  myGLCD.print("->", 190, 85);
}
void secMenu24()
{
  // Рисуется правая кнопка усилия
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (240, 65, 310, 120);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (240, 65, 310, 120);
  myGLCD.printNumI(b, 252, 85);
}

void secMenu31()
{// Повторения
// Рисуется левая кнопка Повторения
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (5, 125, 65, 180);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (5, 125, 65, 180);
  myGLCD.print("<-", 20, 145);
}

void secMenu32()
{
  // Рисуется Повторения
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (70, 125, 170, 180);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (70, 125, 170, 180);
  myGLCD.print("REPS", 80, 145);
}

void secMenu33()
{
  // Рисуется значение Повторения
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (175, 125, 235, 180);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (175, 125, 235, 180);
  myGLCD.print("->", 190, 145);
}

void secMenu34()
{
  // Рисуется правая кнопка Повторения
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (240, 125, 310, 180);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (240, 125, 310, 180);
  myGLCD.printNumI(c, 252, 145);
}
void secMenu4()
{
  // Возврат в меню
// Рисуется возврат в меню
  myGLCD.setColor(100, 200, 140);
  myGLCD.fillRoundRect (5, 185, 310, 235);
  myGLCD.setColor(0, 0, 0);
  myGLCD.drawRoundRect (5, 185, 310, 235);
  myGLCD.print("Apply", 120, 200); 
}

void Vibration()
{
digitalWrite(Vib, HIGH);
digitalWrite(Aud, HIGH);
delay(150);
digitalWrite(Vib, LOW);
digitalWrite(Aud, LOW);
delay(150);
}

void Vibration2()  
{
digitalWrite(Vib, HIGH);
digitalWrite(Aud, HIGH);
delay(150);
digitalWrite(Vib, LOW);
digitalWrite(Aud, LOW);
delay(50);
digitalWrite(Vib, HIGH);
digitalWrite(Aud, HIGH);
delay(150);
digitalWrite(Vib, LOW);
digitalWrite(Aud, LOW);
delay(50);
digitalWrite(Vib, HIGH);
digitalWrite(Aud, HIGH);
delay(500);
digitalWrite(Vib, LOW);
digitalWrite(Aud, LOW);
delay(50);
}

/*************************
**  Required functions  **
*************************/

void setup()
{while(true)
 {
  motor.step(100, FORWARD, SINGLE); 
  motor.step(100, BACKWARD, SINGLE); 

  motor.step(100, FORWARD, DOUBLE); 
  motor.step(100, BACKWARD, DOUBLE);

  motor.step(100, FORWARD, INTERLEAVE); 
  motor.step(100, BACKWARD, INTERLEAVE); 

#ifdef MICROSTEPPING
  motor.step(100, FORWARD, MICROSTEP); 
  motor.step(100, BACKWARD, MICROSTEP); 
#endif
}
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

Тот код что вы дали - явно не полный, он вообще не содержит loop(), и явно не может "работает только меню"

То есть в словах вы описали одну ситуацию, а код дали для другой.

Так что остается "только гадать".

А причиной может быть:

1. Нехватка памяти (для экранов, да еще с тачем - даже меги может хватать "едва/едва", особенон если экран большой) - самое гиморойное для вылавливания
2. Библиотека степпера и экрана использует одни и те же таймеры/прерывания/пины
3. Библитека степпера или код для работы с меню являются "блокирующими" (содержат циклы вида while(Что-то-должно-случится){}, delay() и т.п.)

 

 

Otheral
Offline
Зарегистрирован: 22.10.2012

Извиняюсь, немного не то вставил.

Код вот...

Использовал как AFMotor.h так и AFMotorSPI.h одинаково не работает.

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

#include <UTFT.h>
#include <UTouch.h>
#include <AFMotorSPI.h>

extern uint8_t BigFont[];


UTFT myGLCD(ILI9325D_8,A5,A4,A3,A2);
UTouch      myTouch(A1,A2,A0,8,9);

int x, y, a, b, c, h, t, p, h1, t1,m;
int Vib = A13;
int Aud = A15;
AF_Stepper motor(48, 2);
/*************************
**   Custom functions   **
*************************/

void drawSettings()
{
 // Основное меню 
 // Рисуется верхняя кнопка
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (5, 5, 310, 120);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (5, 5, 310, 120);
 myGLCD.print("SETTINGS", 90, 60);
}

void drawStart()
{
 // Рисуется нижняя кнопка
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (5, 130, 310, 240);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (5, 130, 310, 240);
 myGLCD.print("START", 115, 180);
}

void drawProcess()
{
 // Рисуется PROCESS
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (70, 70, 245, 170);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (70, 70, 245, 170);
 myGLCD.print("PROCESS", 100, 112);
}

void secMenu11()
{
 // Меню настроек
 // Рисуется левая кнопка скорости
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (5, 5, 65, 60);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (5, 5, 65, 60);
 myGLCD.print("<-", 20, 25);
}

void secMenu12()
{
 // Рисуется скорость 
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (70, 5, 170, 60);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (70, 5, 170, 60);
 myGLCD.print("Speed", 80, 25);
}

void secMenu13()
{
 // Рисуется правая кнопка скорости
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (175, 5, 235, 60);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (175, 5, 235, 60);
 myGLCD.print("->", 190, 25);
}

void secMenu14()
{
 // Рисуется значение скорости
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (240, 5, 310, 60);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (240, 5, 310, 60);
 myGLCD.printNumI(a, 252, 25);
}  

void secMenu21()
{
// Усилие
// Рисуется левая кнопка усилия
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (5, 65, 65, 120);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (5, 65, 65, 120);
 myGLCD.print("<-", 20, 85);
}

void secMenu22()
{
 // Рисуется Усилие
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (70, 65, 170, 120);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (70, 65, 170, 120);
 myGLCD.print("Force", 80, 85);
}

void secMenu23()
{
 // Рисуется значение усилия
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (175, 65, 235, 120);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (175, 65, 235, 120);
 myGLCD.print("->", 190, 85);
}

void secMenu24()
{
 // Рисуется правая кнопка усилия
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (240, 65, 310, 120);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (240, 65, 310, 120);
 myGLCD.printNumI(b, 252, 85);
}

void secMenu31()
{
 // Повторения
 // Рисуется левая кнопка Повторения
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (5, 125, 65, 180);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (5, 125, 65, 180);
 myGLCD.print("<-", 20, 145);
}

void secMenu32()
{
 // Рисуется Повторения
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (70, 125, 170, 180);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (70, 125, 170, 180);
 myGLCD.print("REPS", 80, 145);
}

void secMenu33()
{
 // Рисуется значение Повторения
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (175, 125, 235, 180);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (175, 125, 235, 180);
 myGLCD.print("->", 190, 145);
}

void secMenu34()
{
 // Рисуется правая кнопка Повторения
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (240, 125, 310, 180);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (240, 125, 310, 180);
 myGLCD.printNumI(c, 252, 145);
}
void secMenu4()
{
 // Возврат в меню
 // Рисуется возврат в меню
 myGLCD.setColor(100, 200, 140);
 myGLCD.fillRoundRect (5, 185, 310, 235);
 myGLCD.setColor(0, 0, 0);
 myGLCD.drawRoundRect (5, 185, 310, 235);
 myGLCD.print("Apply", 120, 200); 
}

void Vibration()
{
 digitalWrite(Vib, HIGH);
 digitalWrite(Aud, HIGH);
 delay(150);
 digitalWrite(Vib, LOW);
 digitalWrite(Aud, LOW);
 delay(150);
}

void Vibration2()  
{
 digitalWrite(Vib, HIGH);
 digitalWrite(Aud, HIGH);
 delay(150);
 digitalWrite(Vib, LOW);
 digitalWrite(Aud, LOW);
 delay(50);
 digitalWrite(Vib, HIGH);
 digitalWrite(Aud, HIGH);
 delay(150);
 digitalWrite(Vib, LOW);
 digitalWrite(Aud, LOW);
 delay(50);
 digitalWrite(Vib, HIGH);
 digitalWrite(Aud, HIGH);
 delay(500);
 digitalWrite(Vib, LOW);
 digitalWrite(Aud, LOW);
 delay(50);
}

/*************************
**  Required functions  **
*************************/

void setup()
{
 myGLCD.InitLCD();
 myGLCD.clrScr();
 myTouch.InitTouch();
 myTouch.setPrecision(PREC_MEDIUM);
 myGLCD.setFont(BigFont);
 myGLCD.setBackColor(100,200,140);
 drawSettings();
 drawStart();
 a=4;
 b=4;
 c=4;
 p=0;
 m=0;
 pinMode(Vib, OUTPUT);
 pinMode(Aud, OUTPUT);
motor.setSpeed(10);
}

void loop()
{ while(true)
 {
  motor.step(100, FORWARD, SINGLE); 
  motor.step(100, BACKWARD, SINGLE); 

  motor.step(100, FORWARD, DOUBLE); 
  motor.step(100, BACKWARD, DOUBLE);

  motor.step(100, FORWARD, INTERLEAVE); 
  motor.step(100, BACKWARD, INTERLEAVE); 

#ifdef MICROSTEPPING
  motor.step(100, FORWARD, MICROSTEP); 
  motor.step(100, BACKWARD, MICROSTEP); 
#endif
 }}

 

Otheral
Offline
Зарегистрирован: 22.10.2012

Я больше склоняюсь к варианту 

2. Библиотека степпера и экрана использует одни и те же таймеры/прерывания/пины

Моей квалификации не хватает чтоб найти косяки, может подскажете с чего хотябы начать поиск? в библиотеках этих сам черт ногу сломит, непонятно ничего(((

leshak
Offline
Зарегистрирован: 29.09.2011

Для начала, хотя это и не есть причина проблема - while(true) - внутри loop() - совершенно лишний. Вернее он не мешает, но и пользы никакой не несет. loop() сам по себе бесконечно зациклен (потому и называется так). Так что while(true) - можно смело выбрасывать, оставить только motor.step() - логика не изменится.

Далее, вам нужно выяснить "где-то застряет" скетч или "работает неправильно" (кстати вы не сказали, что же именно вы выдите - на экране что-то нарисовалось?).

Натыкайте в Setup()  диагностических Serial.println, к примеру после

myGLCD.InitLCD();

сдалать

Serial.println("Init LCD - done");

После drawStart, -"Menu init done".

К конце setup()- Serial.println("Setup done");

Тогда будет видно "куда он добрался" и крутит ли он вообще ваш loop().

Можете вообще попытатся закоментить строки 221-288 (все остальное - оставить как есть), посмотреть начнет ли так движок крутится. Если начнет - начать по одной строке раскоменчивать. Смотреть "после чего перестанет". Если поймаете - тогда уже лезть в библиотеку и смотреть что именно она делает и пытатся понять как с движком законфликтовать могла.

 

Otheral
Offline
Зарегистрирован: 22.10.2012

Сделал все как вы говорили. Затыкается не при инициализации а при выполнении кода.

Ситуация следующая, если закоментировать UTFT и UTouch, а так же все что с ними связано, то крутит двигатель.

Если закоментровать myGLCD.InitLCD(); и myTouch.InitTouch(); то инициализации нет и тоже все работает.

Если раскоментировать отдельно myGLCD.InitLCD(); то двигатель начинает дергаться, не крутит, такое ощущение что одну обмотку отключает.

Если раскоментировать отдельно myTouch.InitTouch(); то не работает вовсе.

Ну если обе само сабой не работает...

 

leshak
Offline
Зарегистрирован: 29.09.2011

ну значит нужно начить смотреть что там инициализуется выставляется в  myGLCD.InitLCD();

Дайте сюда прямые ссылки на используемые вами библиотеки (где вы их брали, что-бы можно было сразу скачать/посмотреть не выискивая).

Не буду общать что "все брошу и займусь", но как будет время - попробую посмотреть что там(если до выходных не успею/забуду - можете тут дернуть/напомнить).

>Сделал все как вы говорили.

Это радует. Знали бы вы сколько людей спрашивают совета а потом начинают с ним спорить или игнорировать ;)

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

Вообщем-то это обычные советы по тому как повысить вероятсность (гарантии никто не даст) что вам кто-то поможет (не обязательно я). Чем больше справочной инфы о своей ситуации вы дадите - тем выше вероятность что кто-то "проходя мимо, бросив вгляд" заметит в чем причина. А если же для этого нужно "что-то гуглить, вычитывать другую тему" - то могут просто "пройти мимо" :)

А еще, не глядя, просто общий совет (часто бешься, а причина банальна) - попробуйте все это запитать не от USB, а внешнего блока питания (если еще не так питаете). Да и тестером померять что там происходит на 5v и 3.3v пине - всегда полезно. Знали бы вы сколько "чудес" в итоге объясняется именно плохим питанием (сам на это часы убил, и продолжаю регулярно наступать на эти грабли).

Otheral
Offline
Зарегистрирован: 22.10.2012

Спасибо за советы:) Питание как от ЮСБ так и от блока питания одно и то же, я тоже сразу на питание начал грешить, ан нет) Когда все шилды к Ардуине присоединяешь, и загружаешь скетч меню, оно работает на ура, и начинает чудить только когда изменения вносишь с AFMotor библиотекой.

UTFT я брал отсюда http://henningkarlsen.com/electronics/library.php?id=52

UTouch http://henningkarlsen.com/electronics/library.php?id=56

Для обеспечения работы экрана была заменена библиотека UTFT\HW_AVR.h, без нее Мега 2560 не работает с экраном, ее исправление по ссылке http://arduino.ru/forum/apparatnye-voprosy/raznitsa-pri-podklyuchenii-tft-k-leonardo-i-mega-2560 пост №26 (вы к стати в этой теме же были))))

AFMotor с SPI исправлением http://www.freeduino.ru/arduino/files/AFMotorSPI-08_12_2009.zip (при нажатии криво открывается лучше строку в браузер скопипастить)

 и без него http://www.freeduino.ru/arduino/files/AFMotor-08_12_2009.zip

Это описание мотор шилда http://freeduino.ru/arduino/mshield.html

Это описание тачскрина 

ftp://imall.iteadstudio.com/IM120417020_2.8_TFT_LCD_Touch_Shield/DS_IM120417020_2.8_TFT_LCD_Touch_Shield.pdf

Ардуино Мега 2560

leshak
Offline
Зарегистрирован: 29.09.2011

>(вы к стати в этой теме же были)

Мало ли где я был. Найдите поиском в скольки темах я был, есть шансы что я вообще помню о чем там речь? ;)

Так, бегло.... не вникая (совершенно не уверен, просто "куда бы я смотрел").

В AFMotorSPI.h - настораживает строка

#define MOTORDATA 8

Этот же пин видим при инициализаии UTouch      myTouch(A1,A2,A0,8,9);

Так же стоит перепроверить какой таймер использует мотором timer1 или timer2 и под даташиту глянуть, какие пины соответсвуют этим таймерам - может еще по ним конфликт.

 

P.S. В этом всем - совершенно не уверен. Просто "направление куда бы я копал..."

 

 

Otheral
Offline
Зарегистрирован: 22.10.2012

Многоуважаемый leshak.

Случилось страшное, перестал работать экран, горит белым и все. Все контакты в норме, походу что то сгорело в нем. Думаю купить новый экран, может подскажете какой лучше купить чтобы был тач и в добавок проблем с ним небыло как с этим, т.е. работал с моторшилдом и с мегой? Может как нибуть изменить вобще конфигурацию чтобы избежать аппаратно-программных несостыковок?

AndreyFly
Offline
Зарегистрирован: 26.03.2016

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