0 голосов
При использовании платформы Strela в случае включения двигателя (drive(x,x)) перестает работать lcd - показывает последний текст и не обновляет его
(2 баллов) 3
Скетч не покажите?
[code]
// библиотека для работы с RFID/NFC
#include <Adafruit_PN532.h>

// бибилиотека для работы со стрелой
#include <Strela.h>
// бибилиотека для ИК приёмника
#include <IRremote.h>
//библиотека для дисплея
#include <LiquidCrystal_I2C.h>
//#include <LiquidCrystal.h>
 
// даем имя пину подключения ИК приёмника
int RECV_PIN = P8;
// даем имя пину на котором расположен встроенный светодиод
int LED_PIN = L1;

#define PN532_IRQ   P9
// создаём объект для работы со сканером и передаём ему два параметра
// первый — номер пина прерывания
// вторым — число 100
// от Adafruit был программный сброс шилда
// в cканере RFID/NFC 13,56 МГц (Troyka-модуль) этот пин не используется
// поэтому передаём цифру, большая чем любой пин Arduino
Adafruit_PN532 nfc(PN532_IRQ, 100);

// указываем к какому пину подключен ИК приёмник
IRrecv irrecv(RECV_PIN);
decode_results results;

// Создадим объект lcd, который будет выводить текст на экран
LiquidCrystal_I2C lcd(LC_ADDR, LCEN, LCRW, LCRS, LC4, LC5, LC6, LC7);
//количество просмотренных карт
byte assume_card=0;



uint8_t ArrayOfCard[40][8];


void setup()
{

  // инициируем открытие сериал порта и указываем его скорость
  Serial.begin(9600);
  // запускаем работу ИК приемника
  irrecv.enableIRIn();

  nfc.begin();
  int versiondata = nfc.getFirmwareVersion();
  if (!versiondata) {
    Serial.print("Didn't find RFID/NFC reader");
    while(1) {
    }
  }

  // инициализация массива
  for(uint8_t a=0;a<40;a++){
    for(uint8_t b=0;b<8;b++){
      ArrayOfCard[a][b]=0; //{0,0,0,0,0,0,0,0};
    }
  }
 
  Serial.println("Found RFID/NFC reader");
  // настраиваем модуль
  nfc.SAMConfig();
  Serial.println("Waiting for a card ...");

    //Инициализация экрана. У нашего экрана 8 символов 2 строки
  lcd.begin(8, 2);
  //Переместим курсор в начало первой стройки (символ 0, строка 0)
  lcd.home();
  //Печатаем строку
  lcd.print("RFID/NFC");
  //Переместим строку в начало второй строки (символ 0, строка 1)
  lcd.setCursor(0, 1);
  //Печатаем строку
  lcd.print(" Found! ");
  //Пауза, чтобы успеть насладиться результатом
  delay(2000);
  lcd.home();
  //Печатаем строку
  lcd.print("Waiting ");
  //Переместим строку в начало второй строки (символ 0, строка 1)
  lcd.setCursor(0, 1);
  //Печатаем строку
  lcd.print("a card  ");
  //Пауза, чтобы успеть насладиться результатом
  delay(2000);  
}
 
void loop()
{
    //часть для работы с rfid
  uint8_t success;
  // буфер для хранения ID карты
  uint8_t uid[8];
  // размер буфера карты
  uint8_t uidLength;

  // принимаем данные с ИК пульта
  // в зависимости от нажатой кнопки пульта
  // даём разные команды роботу
   
  //  lcd.begin(16, 2);
  // печатаем первую строку
  //lcd.print("Hello world");
  
  if (irrecv.decode(&results)) {
    if (results.value == 0x1689609F) {
      ford();
    } else if (results.value == 0x1689B847) {
      back();   
    } else if (results.value == 0x168910EF) {
      left();   
    } else if (results.value == 0x16899867) {
      right();   
    } else if (results.value == 0x168938C7) {
      stop();   
    }
    // ждем следующее значение
    irrecv.resume();
  }


  // слушаем новые метки
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength,200);
  // если найдена карта
  if (success) {
    // выводим в консоль полученные данные
    Serial.println("Found a card");
    Serial.print("ID Length: ");
    Serial.print(uidLength, DEC);
      Serial.println(" bytes");
    Serial.print("ID Value: ");
    nfc.PrintHex(uid, uidLength);

   if(!checkUID_RFID(uid)){
    for(int z=0;z<8;z++){
      ArrayOfCard[assume_card][z]=uid[z];
   }
      Serial.println("!!!!!!!!!!!!!!!!!!!!!!!!");
      nfc.PrintHex(ArrayOfCard[assume_card], 7);
      Serial.println("");
    //    lcd.home();
    //Печатаем строку
      lcd.clear();
      lcd.home();
      assume_card=assume_card+1;
      lcd.print(assume_card);
      unsigned long time = millis();
      lcd.setCursor(0, 1);
      lcd.print(time);
      melody();
      //delay(1000);
    }
  }
}
// функция движение вперёд
void back() {
//  myservoFordL.write(0);
//  myservoFordR.write(180);
//  myservoBackL.write(0);
//  myservoBackR.write(180);

//  if (irrecv.decode(&results)) {
//    if (results.value == 0xFFFFFFFF) {
//       drive(127, 127);   //Средний ход вперёд
//    }else {drive(0, 0);}
//  }
  //delay(500);
  // drive(60, 60);
  Serial.println("BACK");
      lcd.clear();
      lcd.home();
      lcd.print("BACK");
}
 
// функция движение назад
void ford() {
//  myservoFordL.write(180);
//  myservoFordR.write(0);
//  myservoBackL.write(180);
//  myservoBackR.write(0);
  Serial.println("FORD");
  //drive(-60, -65);
      lcd.clear();
      lcd.home();
      lcd.print("FORD");
}
 
// функция поворота налево
void right() {
//  myservoFordL.write(180);
//  myservoFordR.write(180);
//  myservoBackL.write(180);
//  myservoBackR.write(180);
  drive(0, -50);
  Serial.println("left");
}
 
// функция поворота направо
void left() {
//  myservoFordL.write(0);
//  myservoFordR.write(0);
//  myservoBackL.write(0);
//  myservoBackR.write(0);
  Serial.println("right");
  drive(-50,0);
}
 
// функция остановки
void stop() {
//  myservoFordL.write(90);
//  myservoFordR.write(90);
//  myservoBackL.write(90);
//  myservoBackR.write(90);
  drive(0, 0);
  Serial.println("stop");
}

//функция звука попал на метку
void melody(void)
{

  tone(BUZZER,1046,150);
  delay(300);
  tone(BUZZER,1046,150);
  delay(150);
  tone(BUZZER,1174,300);
  delay(300);
  tone(BUZZER,1318,150);
}

//проверка наличия в базе текущего RFID_UID, возвращает true если есть в базе, false - если нет
boolean checkUID_RFID(uint8_t uid1[8])
{
    Serial.println("uid!!!!!!!!!!!!!!!!!");
    nfc.PrintHex(uid1, 7);
      Serial.println("array0!!!!!!!!!!!!!!!!!");
    nfc.PrintHex(ArrayOfCard[0], 7);
      Serial.println("array1!!!!!!!!!!!!!!!!!");
    nfc.PrintHex(ArrayOfCard[1], 7);   
      Serial.println("array2!!!!!!!!!!!!!!!!!");
    nfc.PrintHex(ArrayOfCard[2], 7);  
      Serial.println("array3!!!!!!!!!!!!!!!!!");
    nfc.PrintHex(ArrayOfCard[3], 7);
  boolean res;   
  for(int a=0;a<assume_card;a++){
    Serial.println("+++++++++++++++++++++++++");
    byte i=0;
    while(i<8){
      Serial.print("~");
      Serial.print(ArrayOfCard[a][i]);
      Serial.print("===");
      Serial.print(uid1[i]);
      if(ArrayOfCard[a][i]!=uid1[i]){
        res=false;
        break;
      }
      i++;
      res=true;
    }
  if(res){return true;}
  }
  return false;
}
[/code]

2 Ответы

+1 голос
Что за двигатели и от чего питаете? Возможно из за посадок напряжения все подвисает.
(256 баллов) 1 3 14
ТТХ двигателя:
Тип двигателя: коллекторный
Номинальное напряжение: 12 В
Скорость без нагрузки: 600 об/мин
Ток без нагрузки: 50 мА
Ток блокировки: 750 мА
Сопротивление обмотки: 16 Ом
Передаточное соотношение: 1:50
Материал шестерней редуктора: металл
Диаметр выходного вала: 3 мм
Длина вала: 10 мм
Длина корпуса: 26 мм
Габариты: 36×12×10 мм
Вес: 10 гр

Питаю от двух lion аккумуляторов 3.7 В. Прбовал добавлять еще один, и откючал двигатели вообще - не помогало
0 голосов
iiiiiiiiiiiiiiiiii
(441 баллов) 3 7 17 1 отметил
Добавление lcd.begin(8,2), конечно помогло. Но только, по-моему, это конструктор, и его множественное выполнение может привести к переполнению памяти.
Заодно код чуть почистил от лишних комментариев и отладочных команд

// библиотека для работы с RFID/NFC
#include <Adafruit_PN532.h>

// бибилиотека для работы со стрелой
#include <Strela.h>
// бибилиотека для ИК приёмника
#include <IRremote.h>
//библиотека для дисплея
#include <LiquidCrystal_I2C.h>
//#include <LiquidCrystal.h>
 
// даем имя пину подключения ИК приёмника
int RECV_PIN = P8;
// даем имя пину на котором расположен встроенный светодиод
int LED_PIN = L1;

#define PN532_IRQ   P9
// создаём объект для работы со сканером и передаём ему два параметра
// первый — номер пина прерывания
// вторым — число 100
// от Adafruit был программный сброс шилда
// в cканере RFID/NFC 13,56 МГц (Troyka-модуль) этот пин не используется
// поэтому передаём цифру, большая чем любой пин Arduino
Adafruit_PN532 nfc(PN532_IRQ, 100);

// указываем к какому пину подключен ИК приёмник
IRrecv irrecv(RECV_PIN);
decode_results results;

// Создадим объект lcd, который будет выводить текст на экран
LiquidCrystal_I2C lcd(LC_ADDR, LCEN, LCRW, LCRS, LC4, LC5, LC6, LC7);
//количество просмотренных карт
byte assume_card=0;



uint8_t ArrayOfCard[40][8];


void setup()
{

  // инициируем открытие сериал порта и указываем его скорость
  Serial.begin(9600);
  // запускаем работу ИК приемника
  irrecv.enableIRIn();

  nfc.begin();
  int versiondata = nfc.getFirmwareVersion();
  if (!versiondata) {
    Serial.print("Didn't find RFID/NFC reader");
    while(1) {
    }
  }

  // инициализация массива
  for(uint8_t a=0;a<40;a++){
    for(uint8_t b=0;b<8;b++){
      ArrayOfCard[a][b]=0; //{0,0,0,0,0,0,0,0};
    }
  }
 
  Serial.println("Found RFID/NFC reader");
  // настраиваем модуль
  nfc.SAMConfig();
  Serial.println("Waiting for a card ...");

    //Инициализация экрана. У нашего экрана 8 символов 2 строки
  lcd.begin(8, 2);
  //Переместим курсор в начало первой стройки (символ 0, строка 0)
  lcd.home();
  //Печатаем строку
  lcd.print("RFID/NFC");
  //Переместим строку в начало второй строки (символ 0, строка 1)
  lcd.setCursor(0, 1);
  //Печатаем строку
  lcd.print(" Found! ");
  //Пауза, чтобы успеть насладиться результатом
  delay(2000);
  lcd.home();
  //Печатаем строку
  lcd.print("Waiting ");
  //Переместим строку в начало второй строки (символ 0, строка 1)
  lcd.setCursor(0, 1);
  //Печатаем строку
  lcd.print("a card  ");
  //Пауза, чтобы успеть насладиться результатом
  delay(2000);  
}
 
void loop()
{
    //часть для работы с rfid
  uint8_t success;
  // буфер для хранения ID карты
  uint8_t uid[8];
  // размер буфера карты
  uint8_t uidLength;

  // принимаем данные с ИК пульта
  // в зависимости от нажатой кнопки пульта
  // даём разные команды роботу
   
  if (irrecv.decode(&results)) {
    if (results.value == 0x1689609F) {
      ford();
    } else if (results.value == 0x1689B847) {
      back();   
    } else if (results.value == 0x168910EF) {
      left();   
    } else if (results.value == 0x16899867) {
      right();   
    } else if (results.value == 0x168938C7) {
      stop();   
    }
    // ждем следующее значение
    irrecv.resume();
  }


  // слушаем новые метки
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength,200);
  // если найдена карта
  if (success) {
   if(!checkUID_RFID(uid)){
    for(int z=0;z<8;z++){
      ArrayOfCard[assume_card][z]=uid[z];
   }
    //Печатаем строку
      lcd.begin(8,2);
      lcd.clear();
      lcd.home();
      assume_card=assume_card+1;
      lcd.print(assume_card);
      unsigned long time = millis();
      lcd.setCursor(0, 1);
      lcd.print(time);
      melody();
    }
  }
}
// функция движение вперёд
void back() {
  drive(60, 60);
}
 
// функция движение назад
void ford() {
  drive(-60, -65);

}
 
// функция поворота налево
void right() {
  drive(0, -50);
}
 
// функция поворота направо
void left() {
  drive(-50,0);
}
 
// функция остановки
void stop() {
  drive(0, 0);
}

//функция звука попал на метку
void melody(void)
{

  tone(BUZZER,1046,150);
  delay(300);
  tone(BUZZER,1046,150);
  delay(150);
  tone(BUZZER,1174,300);
  delay(300);
  tone(BUZZER,1318,150);
}

//проверка наличия в базе текущего RFID_UID, возвращает true если есть в базе, false - если нет
boolean checkUID_RFID(uint8_t uid1[8])
{
  boolean res;   
  for(int a=0;a<assume_card;a++){
    byte i=0;
    while(i<8){
      if(ArrayOfCard[a][i]!=uid1[i]){
        res=false;
        break;
      }
      i++;
      res=true;
    }
  if(res){return true;}
  }
  return false;
}
Не беспокойтесь это не конструктор.
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. Aromik

    73 балл(ов)

  2. Un_ka

    54 балл(ов)

  3. parovoZZ

    12 балл(ов)

  4. sser

    6 балл(ов)

  5. Тёмик

    5 балл(ов)

  6. NesteruS

    5 балл(ов)

Награды месяца
1-е место: OLED-дисплей (Troyka-модуль)
2-е место: Графический экран 128×64
3-е место: Текстовый дисплей 16×2 (Troyka-модуль)

...