Бот не активируется после нажатия кнопки
Предполагается, что этот бот начнет двигаться вперед при нажатии кнопки и остановится после того, как отсчитает 3 линии ленты на земле. В настоящее время он настроен на сканирование цвета пола в начале и подсчет любых существенных различий как на полосе ленты. К сожалению, я не могу проверить его возможности распознавания ленты, поскольку не могу его запустить. Он будет двигаться только в том случае, если я буду постоянно удерживать кнопку, и остановится, как только я ее отпущу. Вот код и изображения (используется Arduino Pro Mini 3.3v):
#include <SFE_ISL29125.h>
SFE_ISL29125 RGB;
unsigned int master2;
unsigned int detect2;
boolean isOn = false;
unsigned int accumulator = 0;
void setup() {
RGB.init();
pinMode(7, INPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
master2 = RGB.readGreen();
}
void loop() {
if(isOn) {
if(accumulator < 3) {
detect2 = RGB.readGreen();
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
if(detect2 <= (master2 - 10) || detect2 >= (master2 + 10)) {
accumulator++;
}
} else {
accumulator = 0;
isOn = false;
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
} else if(digitalRead(7) == HIGH) {
isOn = true;
} else {
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
}
@Bakna, 👍0
Обсуждение1 ответ
Я сильно подозреваю, что основные проблемы вашего кода кроются в этих строках:
if(detect2 <= (master2 - 10) || detect2 >= (master2 + 10)) {
accumulator++;
}
Если я правильно понимаю, с помощью этого кода вы пытаетесь определить, прошли ли вы через линию ленты, что будет указано изменением показаний от RGB.readGreen();
- скажем, высокий, низкий, высокий. Если так, accumulator++
. (У меня нет мнения о том, является ли это допустимым способом определения или насколько хорошо будет работать ваш датчик.)
Это определенно сломано в одном отношении и, вероятно, сломано в другом.
Сначала определенно сломанный способ:
Вы хотите распознать нисходящий-вверх-нисходящий-вверх-нисходящий-вверх (или восходящий-нисходящий-вверх-нисходящий-вверх-вниз). Ваш код просто распознает три более высоких или более низких показания. Ваш loop()
не занимает времени вообще, поэтому, когда ваш багги перемещается на ленту, он немедленно считывает (скажем) высокий уровень, затем делает цикл, снова считывает высокий уровень, снова считывает высокий уровень и снова. accumulator
теперь равен 3, и мы останавливаем двигатель.
Второй, возможно, сломанный способ:
Какое значение имеет master2
? Предположим, что это беззнаковое целое число. Вы вычитаете из него 10. Что вы получите, если его значение равно 5
? Оно может быть равно -5
, потому что оно беззнаковое. Как вы решите это, зависит от возможного диапазона значений из RGB.readGreen();
. реализация выглядит так, как будто она может дать значение в любом месте диапазона, поэтому нам нужно быть осторожными.
Вот моя переработка вашего кода. Она предполагает, что концепция проверки значений, которые отличаются на 10 от исходного значения, разумна — я понятия не имею, так ли это. (Я не понимаю, что означают эти «средние» значения, но вы говорите, что «уже тестировали компоненты по отдельности», во что я не верю, потому что ваш код никогда не мог бы работать, но, предположим, вы видели, как работает что-то похожее...) Она также делает очень большое предположение, что значение будет изменяться чисто — от большего к меньшему ровно один раз на каждом краю полосы, без колебаний. Выведите некоторые значения, чтобы узнать, действительно ли это так.
#include <SFE_ISL29125.h>
SFE_ISL29125 RGB;
int master2;
boolean isOn = false;
int changes = 0;
#define BUTTON 7
#define MOTOR_A 8
#define MOTOR_B 9
#define LOWER 0
#define HIGHER 1
int last_state = 0;
void setup() {
RGB.init();
pinMode(BUTTON, INPUT);
pinMode(MOTOR_A, OUTPUT);
pinMode(MOTOR_B, OUTPUT);
master2 = (int)(RGB.readGreen()/2);
}
void loop() {
if(isOn) {
// Дождитесь 6 изменений: вверх-вниз или вниз-вверх, три раза.
if(changes < 6) {
int detect2 = (int)(RGB.readGreen()/2);
digitalWrite(MOTOR_A, HIGH);
digitalWrite(MOTOR_B, LOW);
// Подсчет _изменений_ только в состоянии
if(last_state == HIGHER && detect2 <= (master2 - 5) {
last_state = LOWER;
changes++;
} else if (last_state == LOWER && detect2 >= (master2 + 5)) {
last_state = HIGHER;
changes++;
}
} else {
accumulator = 0;
isOn = false;
digitalWrite(MOTOR_A, LOW);
digitalWrite(MOTOR_B, LOW);
}
} else if(digitalRead(7) == HIGH) {
isOn = true;
} else {
digitalWrite(MOTOR_A, LOW);
digitalWrite(MOTOR_B, LOW);
}
}
- Проблема с сигналом датчика пульса
- Объединение 2 датчиков в один код с 1 кнопкой
- Один метод для 2 ультразвуковых датчиков не работает должным образом
- Rasberry Pi, управляющий Arduino - считывает "призрачный" вход - не завершает логический цикл
- Проблема с датчиком температуры и влажности DHT11
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- MAX30100 не работает
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
Не могли бы вы заменить различные жестко закодированные номера GPIO константами (например, #define), пожалуйста? Трудно (наверное, мне трудно) догадаться, что делают различные контакты., @Mark Smith
Контакт 7 — кнопка, контакты 8 и 9 — двигатель. Меня действительно не беспокоит использование констант, так как я спешу это сделать., @Bakna
Возможно, он накапливается так быстро, что сразу прекращается, как только вы отпустите кнопку?, @Paul
Могу ли я решить эту проблему, увеличив цветовой допуск? Или переключиться на один из датчиков Parallax Line Follower Kit, который у меня лежит?, @Bakna
Выдерните код детектора и проверьте его. Я сильно подозреваю, что ваши показания вызывают проблемы, и код для подсчета трех строк все равно не работает., @Mark Smith
Я уже протестировал компоненты по отдельности. Что вы имеете в виду, когда говорите, что код счетчика сломан?, @Bakna
Делайте это шаг за шагом. Для начала заставьте его двигаться после нажатия кнопки без использования датчика. Я согласен с @MarkSmith, вполне возможно, что проблема в алгоритме считывания вашего датчика., @dhimaspw