Тахометр на базе Леонардо?
Я здесь новенькая. Я не являюсь носителем языка, так что извините за мой английский.
Я только сегодня получил свой Arduino Leonardo. Я попробовал некоторые базовые вычисления и такие вещи, как мигание и взаимодействие с ЖК-дисплеем. Это интересно.
Сейчас я пытаюсь сделать тахометр с помощью Леонардо. Я следую этому уроку.
Я предполагаю, что плата, которую они использовали, отличается от Arduino Leonardo (т. Е. вывод 3-прерывание 0
в Леонардо, но это вывод 2 на плате Arduino Uno, используемой в учебнике). Я попытался сменить контакты в программе и снова подключить схему, но это не сработало.
Это код из учебника:
/* Optical Tachometer
*
* Uses an IR LED and IR phototransistor to implement an optical tachometer.
* The IR LED is connected to pin 13 and ran continually.
* Pin 3 (interrupt 0) is connected across the IR detector.
*
* Code based on: www.instructables.com/id/Arduino-Based-Optical-Tachometer/
* Coded by: arduinoprojects101.com
*/
int ledPin = 13; // IR LED connected to digital pin 13
volatile byte rpmcount;
unsigned int rpm;
unsigned long timeold;
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void rpm_fun() {
//Each rotation, this interrupt function is run twice,
//so take that into consideration for calculating RPM
//Update count
rpmcount++;
}
void setup() {
lcd.begin(16, 2); // intialise the LCD
//Interrupt 0 is digital pin 2, so that is where the IR detector is connected
//Triggers on FALLING (change from HIGH to LOW)
attachInterrupt(0, rpm_fun, FALLING);
//Turn on IR LED
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
rpmcount = 0;
rpm = 0;
timeold = 0;
}
void loop() {
//Update RPM every second
delay(1000);
//Don't process interrupts during calculations
detachInterrupt(0);
//Note that this would be 60*1000/(millis() - timeold)*rpmcount if the interrupt
//happened once per revolution instead of twice. Other multiples could be used
//for multi-bladed propellers or fans
rpm = 30*1000/(millis() - timeold)*rpmcount;
timeold = millis();
rpmcount = 0;
//Print out result to LCD
lcd.clear();
lcd.print("RPM=");
lcd.print(rpm);
//Restart the interrupt processing
attachInterrupt(0, rpm_fun, FALLING);
}
Может ли кто-нибудь помочь мне исправить проект? Кто-нибудь здесь пробовал этот проект раньше?
Спасибо вам!
@x0x, 👍4
Обсуждение1 ответ
Во-первых, убедитесь, что ваши программы работы с жидкокристаллическим дисплеем и проводкой работают, попытавшись что-то отобразить на нем.
Во - вторых, код неверен-он будет иметь некоторые колебания от одного измерения к другому.
Один из способов сделать это-начать синхронизацию только после поступления первого импульса и остановить синхронизацию только после прохождения последнего импульса.
Что-то вроде этого:
- Подождите, пока не упадет край.
- Время 0 равно миллису().
- Подождите, пока не пройдет N импульсов.
- Время 0 равно миллису() минус время 0.
Теперь с помощью time0 и N вы можете рассчитать свои обороты в минуту.
Изменить:
Вот приведенный выше код на работе, работающий под управлением Arduino на PIC24.
Входной сигнал составляет 10 Гц, 1 импульс на оборот, он же 600 об / мин.
Как вы можете видеть,значение оборотов составляет ровно 600 об / мин. Я запускаю код с 8-кратной передискретизацией.
Как я указывал ранее, ваш код внесет неопределенность до одного периода для импульсов. Таким образом, при измерении одного импульса частота вращения может составлять от 0,5 x от истинного значения до 1,0 x от истинного значения.
- Печать string and integer LCD
- Обратное вращение шагового двигателя
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Двигатель постоянного тока шумит, но не вращается
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- 4-битный счетчик вверх и вниз
- Почему сервопривод вращается на 360 градусов?
Попробуйте извлечь фототранзистор, вытащите заземляющий элемент, вставьте и снимите его несколько раз в том месте, где были соединены резистор и фотодиод. Если на ЖК-дисплее появится какая-либо частота вращения, вы поймете, что это неисправный фотодиод или просто недостаточно близко к ик-диоду. Код выглядит нормально, и INT0 действительно находится на выводе D3 вместо D2., @Gerben
Ваша схема кажется мне неправильной (хотя я мало работал с фототранзисторами). Почему у вас нет резистора для светодиода? Он рассчитан на 5 вольт? Кроме того, насколько я знаю, фототранзисторы работают только при наличии света. Кажется странным добавлять подтягивающий резистор, чтобы он всегда считывался высоким..., @Anonymous Penguin
Что конкретно вы сделали, когда сказали, что пытались изменить контакты в программе? вы пробовали запустить программу и изменить проводку, чтобы использовать вывод 3? Кроме того, не могли бы вы уточнить, почему это не работает? всегда ли он печатает 0 оборотов в минуту?, @BrettAM
да, он всегда пишет rpm = 0. Я изменил прерывание 0 на вывод 3 на Леонардо. не могли бы вы, ребята, предложить какой-нибудь простой способ проверить attachInterrupt() с ИК-транзистором, у меня есть как 2 закрепленных (?,?), так и 3 закрепленных ( + , out, -) ИК-транзистора/датчика. Спасибо!, @x0x