Официальный сайт компании Arduino по адресу arduino.cc
Touchscreen + Motor Shield
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 27/03/2013 - 11:50
Есть в наличии 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 } }
Тот код что вы дали - явно не полный, он вообще не содержит loop(), и явно не может "работает только меню"
То есть в словах вы описали одну ситуацию, а код дали для другой.
Так что остается "только гадать".
А причиной может быть:
1. Нехватка памяти (для экранов, да еще с тачем - даже меги может хватать "едва/едва", особенон если экран большой) - самое гиморойное для вылавливания
2. Библиотека степпера и экрана использует одни и те же таймеры/прерывания/пины
3. Библитека степпера или код для работы с меню являются "блокирующими" (содержат циклы вида while(Что-то-должно-случится){}, delay() и т.п.)
Извиняюсь, немного не то вставил.
Код вот...
Использовал как AFMotor.h так и AFMotorSPI.h одинаково не работает.
В тескте куча войдов они описывают кнопки меню, само меню приводить не стал, чтобы не загомождать и так длинный код. В любом случае по идеи двигатель должен демо код выполнить, а он не хочет(((
Я больше склоняюсь к варианту
2. Библиотека степпера и экрана использует одни и те же таймеры/прерывания/пины
Моей квалификации не хватает чтоб найти косяки, может подскажете с чего хотябы начать поиск? в библиотеках этих сам черт ногу сломит, непонятно ничего(((
Для начала, хотя это и не есть причина проблема - 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 (все остальное - оставить как есть), посмотреть начнет ли так движок крутится. Если начнет - начать по одной строке раскоменчивать. Смотреть "после чего перестанет". Если поймаете - тогда уже лезть в библиотеку и смотреть что именно она делает и пытатся понять как с движком законфликтовать могла.
Сделал все как вы говорили. Затыкается не при инициализации а при выполнении кода.
Ситуация следующая, если закоментировать UTFT и UTouch, а так же все что с ними связано, то крутит двигатель.
Если закоментровать myGLCD.InitLCD(); и myTouch.InitTouch(); то инициализации нет и тоже все работает.
Если раскоментировать отдельно myGLCD.InitLCD(); то двигатель начинает дергаться, не крутит, такое ощущение что одну обмотку отключает.
Если раскоментировать отдельно myTouch.InitTouch(); то не работает вовсе.
Ну если обе само сабой не работает...
ну значит нужно начить смотреть что там инициализуется выставляется в myGLCD.InitLCD();
Дайте сюда прямые ссылки на используемые вами библиотеки (где вы их брали, что-бы можно было сразу скачать/посмотреть не выискивая).
Не буду общать что "все брошу и займусь", но как будет время - попробую посмотреть что там(если до выходных не успею/забуду - можете тут дернуть/напомнить).
>Сделал все как вы говорили.
Это радует. Знали бы вы сколько людей спрашивают совета а потом начинают с ним спорить или игнорировать ;)
А еще - могут помочь прямые ссылки на описание ваших шилдов (понимаю что можно нагуглить или найти в той теме, просто для "экономии времени"). И если вы подключаете их как-то кроме "просто нахлобучил" - тоже дайте описание что куда вы подключаете.
Вообщем-то это обычные советы по тому как повысить вероятсность (гарантии никто не даст) что вам кто-то поможет (не обязательно я). Чем больше справочной инфы о своей ситуации вы дадите - тем выше вероятность что кто-то "проходя мимо, бросив вгляд" заметит в чем причина. А если же для этого нужно "что-то гуглить, вычитывать другую тему" - то могут просто "пройти мимо" :)
А еще, не глядя, просто общий совет (часто бешься, а причина банальна) - попробуйте все это запитать не от USB, а внешнего блока питания (если еще не так питаете). Да и тестером померять что там происходит на 5v и 3.3v пине - всегда полезно. Знали бы вы сколько "чудес" в итоге объясняется именно плохим питанием (сам на это часы убил, и продолжаю регулярно наступать на эти грабли).
Спасибо за советы:) Питание как от ЮСБ так и от блока питания одно и то же, я тоже сразу на питание начал грешить, ан нет) Когда все шилды к Ардуине присоединяешь, и загружаешь скетч меню, оно работает на ура, и начинает чудить только когда изменения вносишь с 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
>(вы к стати в этой теме же были)
Мало ли где я был. Найдите поиском в скольки темах я был, есть шансы что я вообще помню о чем там речь? ;)
Так, бегло.... не вникая (совершенно не уверен, просто "куда бы я смотрел").
В AFMotorSPI.h - настораживает строка
#define MOTORDATA 8
Этот же пин видим при инициализаии UTouch myTouch(A1,A2,A0,8,9);
Так же стоит перепроверить какой таймер использует мотором timer1 или timer2 и под даташиту глянуть, какие пины соответсвуют этим таймерам - может еще по ним конфликт.
P.S. В этом всем - совершенно не уверен. Просто "направление куда бы я копал..."
Многоуважаемый leshak.
Случилось страшное, перестал работать экран, горит белым и все. Все контакты в норме, походу что то сгорело в нем. Думаю купить новый экран, может подскажете какой лучше купить чтобы был тач и в добавок проблем с ним небыло как с этим, т.е. работал с моторшилдом и с мегой? Может как нибуть изменить вобще конфигурацию чтобы избежать аппаратно-программных несостыковок?
Здравствуйте. На чем все закончилось? Смогли запустить экран с шаговым мотором в паре или нет?