Головна » Статті » Робототехніка проекти |
Спідометр для велосипеда на ArduinoХочете відстежити швидкість на велосипедній прогулянці? Тоді ця інструкція для вас! У проекті використовується магнітний вимикач (геркон) для вимірювання швидкості обертання колеса велосипеда. Arduino, в свою чергу, розраховує швидкість переміщення в милях / год і передає цю інформацію на LCD дисплей. Встановити цю систему ви можете на будь-який велосипед / колесо. Для цього достатньо вказати радіус колеса для правильного розрахунку. необхідні елементи
ЕлектросхемаЕлектросхема проекту наведена нижче. Вона складається з трьох перемикачів: 1. Один підключений до живлення 9 вольт 2. Другий перемикач - до LCD екрану для його включення / вимикання 3. Магнітний вимикача (геркон), який замикає ланцюг кожен раз, коли колесо робить повний оборот. LCD монітор Parallax, який використовується в проекті, підключається до Arduino за трьома пінам. Один йде до 5 В, один до землі, третій - до серійного виходу (TX) на платі Arduino на цифровому піне 1. Резистори на 10 кОм підключені до перемикачів і підсвічуванні монітора, щоб уникнути перевищення допустимої сили струму між 5 В і землею (ні в якому разі не підключайте 5 В і землю безпосередньо до Arduino). Розпаювання Шілд спідометраВстановіть три ряди конекторів на макетної платі таким чином, щоб вони сіли на плату, як це показано нижче. ГерконГеркон складається з двох частин, вимикача і магніту. З самого вимикача (власне, там і розташований геркон), виходить два дроти. У момент, коли магніт розташовується неподалік, невеликий механічний елемента всередині геркона переміщається і замикає ланцюг. Встановіть струмообмежуючі резистор на 10 кОм між піном A0 і землею на вашій макетної платі. Кінці дроту підключіть до піну A0 і 5V. Цей провід ви протягнете надалі уздовж всього велосипеда до перемикачів. Установка геркона на велосипедДля установки геркона і магніту на колесо велосипеда, використовуйте ізоляційну стрічку. На малюнку зверху показано, що магніт встановлюється на одну їх спиць, а геркон - на раму велосипеда. Таким чином, магніт проходить повз геркона після кожного повного обороту колеса. Підключіть дроти від геркона до кабелів з розпаяно вами плати (як саме підключати - неважливо, так як це просто перемикач). Для перевірки працездатності вашого перемикача, використовуйте код, наведений нижче. У момент, коли магніт проходить повз геркона, Arduino повинна видати ~ +1023, в іншому випадку буде відображатися 0. Відкрийте серійний монітор (Tools - Serial Monitor) в оболонці Arduino IDE і запустіть перевірку. Якщо магніт не генерує сигнал на Геркон, змініть його положення або використовуєте сильніший магніт.
#define reed A0 // пін, який підключений до геркона // змінна для зберігання даних int reedVal; void setup () { Serial.begin (9600); } void loop () { reedVal = analogRead (reed); // отримуємо значення з A0 Serial.println (reedVal); delay (10); } Перевірка працездатностіЗавантажте код, наведений нижче на плату Arduino. Активуйте серійний монітор. У вас повинно відображатимуться число 0.00. Почніть крутити колесо велосипеда. Кожну секунду довго відображатися дані поточної швидкості в милях / год.
// радіус колеса ~ 13.5 дюймів // відстань = pi * 2 * r = ~ 85 дюймів // максимальна швидкість 35 миль / год = ~ 616 дюймів / сек // максимальна кутова швидкість = ~ 7.25 #define reed A0 // пін, який підключений до геркона // змінні int reedVal; long timer; // час між одним повним оборотом (в мс) float mph; float radius = 13.5; // радіус колеса (в дюймах) float circumference; int maxReedCounter = 100; // мінімальний час (в мс) одного обороту int reedCounter; void setup () { reedCounter = maxReedCounter; circumference = 2 * 3.14 * radius; pinMode (reed, INPUT); // НАСТРОЙКА ТАЙМЕРА - таймер дозволяє точно відстежувати час між сигналами геркона cli (); // зупинка переривань // встановлюємо переривання timer1 з частотою 1 кГц TCCR1A = 0; // встановлюємо внутрішній TCCR1A регістр на 0 TCCR1B = 0; // те ж саме для TCCR1B TCNT1 = 0; // встановлюємо інкремент лічильника часу на 1 кГц OCR1A = 1999; // = (1/1000) / ((1 / (16 * 10 ^ 6)) * 8) - 1 // активуємо режим CTC TCCR1B | = (1 << WGM12); TCCR1B | = (1 << CS11); // порівнюємо прерваним таймера TIMSK1 | = (1 << OCIE1A); sei (); // дозволяємо переривання // завершується налаштування ТАЙМЕРА Serial.begin (9600); } ISR (TIMER1_COMPA_vect) {// Переривання з частотою 1 кГц для вимірювань герконом reedVal = digitalRead (reed); // отримуємо значення A0 if (reedVal) {// якщо геркон замкнутий if (reedCounter == 0) {// мінімальний час між імпульсами пройшло mph = (56.8 * float (circumference)) / float (timer); // розраховуємо милі на годину timer = 0; // перезапуск таймера reedCounter = maxReedCounter; // перезапуск reedCounter } else { if (reedCounter> 0) {// не даємо reedCounter прийняти негативні значення reedCounter - = 1; // декремент reedCounter } } } else {// if reed switch is open if (reedCounter> 0) {// не даємо reedCounter прийняти негативні значення reedCounter - = 1; // декремент reedCounter } } if (timer> 2000) { mph = 0; // якщо нові з геркона не надходять нові імпульси, значить колесо не вращется, значить швидкість дорівнює 0 м / год } else { timer + = 1; // інкремент таймера } } void displayMPH () { Serial.println (mph); } void loop () { // відображаємо милі на годину раз в секунду displayMPH (); delay (1000); } LCD дисплейДля установки дисплея вам знадобиться додатковий Шилд. Припаяйте рельсу з контактами мама на виході на protoshield. Три контакту будуть іспользлваться для для підключення рідкокристалічного дисплея. LCD екран повинен щільно встановитися на рейках. установка LCDПідключіть Arduino 5V, Ground, і TX (Arduino цифровий пін 1) до LCD сокету. Не забудьте перевірити правильність установки екрану на підставі міток на платі дисплея. На задній частині екрану Parallax LCD є два перемикача і потенціометр. Потенціометр використовується для ручного регулювання контрасту дисплея. Перемикачі треба встановити в положення, які наведені на фото нижче. Перевірка LCD для спідометраПеревірте код, який наведено нижче. Особисто у мене при першому запуску на екрані з'явилися зовсім незрозумілі, хаотичні символи. Довелося зняти монітор, перезаліть скетч і встановити екран заново. З другого разу все запрацювало. Можливо, проблема була в некоректній прошивці Arduino. На LCD екрані повинна відобразитися напис "Hello World".
// Результат виконання даного скетчу - напис "Hello World" на вашому LCD екрані. Свитч підсвічування повинен бути підключений до цифрового піну 2 //Serial.write(13);// новий рядок void setup () { Serial.begin (9600); pinMode (1, OUTPUT); // tx Serial.write (12); // очищаємо Serial.write ( "Hello World"); } void loop () { } Тумблер підсвічування спідометратумблер підсвічування Підключіть тумблер як це показано на малюнку нижче. Не забудьте з'єднати резистор на 10 кОм з чорним і зеленим проводами. Потім ці дроти підключаються до одного з контактів перемикача. До другого контакту підключаємо червоний провід. Червоний дріт підключаємо до Arduino 5V, другу сторону резистора до землі, зелений провід - до D2. Остаточна програма для спідометраЗавантажте наведений код на Arduino. Перевірте роботу перемикача підсвічування і наскільки коректно відображається швидкість. Уточніть радіус вашого колі в дюймах і вставте це значення в рядок: float radius = '' '' '; У цій частині коду я використовував переривання, щоб змінна "timer" збільшувала своє значення з частотою 1 кГц.
// швидкість велосипеда відображається на LCD екрані // розрахунки // радіус колеса ~ 13.5 дюймів // відстань = pi * 2 * r = ~ 85 дюймів // максимальна швидкість 35 миль / год = ~ 616 дюймів / секунду // максимальна кутова швидкість = ~ 7.25 #define reed A0 // пін, до якого підключений геркон // змінні float radius = 13.5; // радіус колеса (в дюймах) - змініть це для своєму велосипеді int reedVal; long timer = 0; // час одного повного обороту (в мілісекундах) float mph = 0.00; float circumference; boolean backlight; int maxReedCounter = 100; // мінімальний час (в мілісекундах) одного обороту int reedCounter; void setup () { reedCounter = maxReedCounter; circumference = 2 * 3.14 * radius; pinMode (1, OUTPUT); // tx pinMode (2, OUTPUT); // свіч підсвічування pinMode (reed, INPUT); checkBacklight (); Serial.write (12); // очищення cli (); // зупинка переривань // встановлюємо переривання timer1 на частоті 1 кГц TCCR1A = 0; // встановлюємо внутрішній регістр TCCR1A в 0 TCCR1B = 0; // те ж саме для TCCR1B TCNT1 = 0; // встановлюємо інкремент для лічильника 1 кГц OCR1A = 1999; // = (1/1000) / ((1 / (16 * 10 ^ 6)) * 8) - 1 // активуємо режим CTC TCCR1B | = (1 << WGM12); TCCR1B | = (1 << CS11); // таймер порівнює переривання TIMSK1 | = (1 << OCIE1A); sei (); // allow interrupts // Кінець настройки таймера Serial.begin (9600); } void checkBacklight () { backlight = digitalRead (2); if (backlight) { Serial.write (17); // включаємо підсвічування } else { Serial.write (18); // вимикаємо підсвічування } } ISR (TIMER1_COMPA_vect) {// Переривання з частотою 1 кГц для вимірювань герконом reedVal = digitalRead (reed); // отримуємо значення A0 if (reedVal) {// якщо геркон замкнув контакт if (reedCounter == 0) {// мінімальний час між імпульсяамі пройшло mph = (56.8 * float (circumference)) / float (timer); // розрахунок миль в годину timer = 0; // перезавантаження таймера reedCounter = maxReedCounter; // перезавантаження reedCounter } else { if (reedCounter> 0) {// не дозволяє reedCounter прийняти негативне значення reedCounter - = 1; // декремент reedCounter } } } else {// якщо геркон не замкнутий if (reedCounter> 0) {// не дозволяє reedCounter прийняти негативне значення reedCounter - = 1; // декремент reedCounter } } if (timer> 2000) { mph = 0; // якщо не надходять імпульси від геркона, значить швидкість дорівнює 0 } else { timer + = 1; // інкремент таймера } } void displayMPH () { Serial.write (12); // очищаємо Serial.write ( "Speed ="); Serial.write (13); // починаємо новий рядок Serial.print (mph); Serial.write ( "MPH"); //Serial.write("0.00 MPH "); } void loop () { // відображаємо mph раз в секунду displayMPH (); delay (1000); checkBacklight (); } живленняПідключіть послідовно коннектор для батареї і перемикати як це показано на першому малюнку нижче. Червоний дріт від перемикача підключіть до контакту Vin на Arduino, а чорний контакт від коннектора для батареї - до землі на Arduino. Корпус для спідометра на ArduinoБокс для спідометра був вирізаний з фанери товщиною 1/4 ". Використовувалася лазерна різка потужністю 120 Ватт. Розміри боксу - 3.5" x4 "x2". Бокс був спроектований в AutoCAD. Для генерації файлів для лазерного різання використовувався софт Autodesk 123D Make. Потім були додані два отвори для перемикачів і прямокутний отвір для LCD екрана. Крім того, були додані отвори на нижній частині боксу, щоб простіше здійснити кріплення до велосипеда. Стінки боксу кріпляться між собою на клей. Кути треба зачистити наждачкою. Можна використовувати якесь покриття для фанери, щоб надати боксу належний вигляд і захистити від вологи. Завантажити необхідні деталі для боксу можна за посиланнями нижче: Установка Arduino і обв'язки в боксПеремикачі фіксуються в корпусі за допомогою гайок. LCD екран сідає на клей або з фіксується за допомогою гвинтів на передній панелі боксу. Arduino і Protoboard встановлюються поруч з бетарейкой. Знову-таки, можна використовувати клей для фіксації або передбачити кріплення на гвинтах. Встановлюємо спідометр на велосипедБокс із спідометром на Arduino встановлюємо на кермо велосипеда. Можна використовувати пластикові стяжки і sugru для фіксації. Провід, які йдуть від плати до геркона треба пустити таким чином, щоб вони не заважали вам при поїздці і при цьому була можливість повертати кермо. Велосипед зі спідометром на дорозі!Не забувайте про правила поведінки велосипедистів на дорозі! Незважаючи на ваш прекрасний Arduino спідометр, стежте за транспортом і людьми! Залишайте Ваші коментарі, щодо вашого особистим досвідом нижче. У дискусії часто народжуються нові ідеї і проекти! Джерело: http://arduino-diy.com/arduino-spidometr-dlya-velosipeda | |||||||||||||||||||||||||||||||||||||||
Переглядів: 5374 | |
Всього коментарів: 0 | |