Подключение ардуины к габаритам автомобиля
- Войдите на сайт для отправки комментариев
Вс, 03/06/2012 - 22:39
Подключил цифровые входы ардуино с внуир. подтяжкой через диоды шоттки к:
1. Ручному тормозу авто. При включении ручника цепь садится на землю. Все работает. В сериал порту пишет когда ручник вкл. - выкл.
2. К габаритам. При включении габаритов в цепи появляется питание +12В. В сериал порту ничего не пишется вообще. Ардуино не прошивается при таком подключении. Диод подключен верно. Где ошибка?
Видимо это связано с тем, что в первом случае минусом управляется, а во втором плюсом.
Вот схема
Подключаюсь к комбинации приборов, к сигналам на светодиоды.
Попробуйте отключить внутреннюю подтяжку с 19 вывода.
хм, а теоретически это что даст? не спалю?
Нет, не спалите. Просто когда пропадет 12 вольт с габаритов, лампочка в приборке через диод тянет пин к минусу, в полне возможно, что из-за подтяхки к +5В не получется на пине снизить напряжение до поргового.
А при таком подключении светодиод не будет гореть в полнакала?
Это как это в полнакала?
Ну я имею ввиду что с ардуины придет 5в на светодиод.... а с бортсети обычно 12В.
Поэтому и спрашиваю, без подтяжки не будет ардуино питать светодиод в полнакала?
Не понял.... ????
Ну я имею ввиду что с ардуины придет 5в на светодиод.... а с бортсети обычно 12В.
Поэтому и спрашиваю, без подтяжки не будет ардуино питать светодиод в полнакала?
Будет. Только очень маленьким током. И происходить это будет не "без подтяжки", а именно "с подтяжкой". Что есть подтяжка? Подключение ноги, через резистор 20K к питанию дуины. Следовательно когда вы уберете 12v с диода, то ток пойдет 5v->резистор подтяжки->нога->диод->светик->земля.
И да, кстати, можете еще скетч показать публике... мало-ли что там.
А, понял. Просто на схеме нарисованны лампочки, а не светодиоды.
Это не код, а чер-ти что.....
вы что интернет экономите? Где вся управляющая логика? Я понимаю что там по вашему мнению "все в порядке". И скорее всего это так. Но и вариантов когда "подскользнулись на ровном месте" - бывает куча. Почему сразу не показать скетч целиком? Как есть? ctrl-c, ctrl-v.
Если там все нормально - все. забыть и не думать больше об этом.
Извините, хотел как проще.
Исправляюсь...
#include <EEPROM.h> //#include <MsTimer2.h> boolean DEBUG=true; // используется при отладке ////// ********Описание периферии********** /////////// int HandBreakPin=0;// Контакт 0 для сигнала от ручного тормоза int SmallLightPin=1;// Контакт 1 для сигнала от габаритов int TahometrPin = 2; // Контакт 2 для тахометра !!!!!!!!! ПРЕРЫВАНИЕ 0 int SpeedSensorPin = 3; // Контакт 3 для датчика скорости !!!!!!!!!ПРЕРЫВАНИЕ 1 void setup() { // MsTimer2::set(500, Timer2_Timer); // таймер будет срабатывать через каждые 500ms // MsTimer2::start();//запустить таймер //0 pinMode(HandBreakPin, INPUT);// Контакт для сигнала от ручного тормоза digitalWrite(HandBreakPin, HIGH); //внутренняя подтяжка входа +++++ //1 pinMode(SmallLightPin, INPUT);// Контакт для сигнала от габаритов digitalWrite(SmallLightPin, HIGH); //внутренняя подтяжка входа +++++ //2 pinMode(TahometrPin, INPUT); // Контакт для тахометра !!!!!!!!!ПРЕРЫВАНИЕ 0 digitalWrite(TahometrPin, HIGH); //внутренняя подтяжка входа тахометра attachInterrupt(0, TahometrImpulse_on, FALLING); // настройка прерывания и функции на него //3 pinMode(SpeedSensorPin, INPUT); // Контакт для датчика скорости !!!!!!!!!ПРЕРЫВАНИЕ 1 digitalWrite(SpeedSensorPin, HIGH); //внутренняя подтяжка входа датчика скорости attachInterrupt(1, SpeedImpulse_on, FALLING); // настройка прерывания и функции на него } void loop() { if (DEBUG) { Serial.println(digitalRead(SmallLightPin)); delay(1000); Serial.println(digitalRead(HandBreakPin)); delay(1000); } } Далее функции спидометра и тахометра длинные, не имеют отношения к вопросу Кроме того их при отладке пока не использую.Ну первая причина по которой "не работает" и "Ардуино не прошивается при таком подключении" ясна.
В схеме вы нарисовали пины 16,19, а в скетче используете 0,1
Либо вы дали неправильную информацию о подключении, либо подключили 16,19, а читать пытаетеся 0,1
Кроме того. 0,1 - уже занят до вас :) На них работает Serial (и скетчи заливаются). Так что "освободите место". Переезжайте на использование других пинов. Тех же 16,19
Ну и, не существенно, но я бы выкинул строчку 38. Зачем задержка между чтениями двух пинов? Пусть сразу про два говорит, раз в секунду.
p.s. На всяк случай, пины 2,3 - у вас тоже заняты. Спидометром и тахометром. Так что "от 4-того и выше" использовать можно.
И еще, по хорошему, в setup нужно бы добавить, в явном виде Serial.begin
Спасибо.
С схеме действительно ошибочно указано 16, 19 - реально подключено к 0 и 1.
Итак:
1. Освободить пины 0 и 1
2. Serial.begin
И самое главное, как советовали ранее подтяжку digitalWrite(SmallLightPin, HIGH) убирать или нет?
По подтяжке: я бы не убирал. в моем понимании без нее пин, при включении габаритов будет ловить "случайный мусор-помехи из эфира". То 0 возвращать, то 1.
Обратной стороной медали - действительно при выключении габаритов может быть "слабое свечение" диода. От ноги ардуины. Ну думая "маловероятно". Слишком маленький ток. Не хватит его что-бы "зажечь светик" (тем более 12-ти вольтовый).
Зачем Максим советовал выключить подтяжку - я не понял. Хотя в схемотехнике, вроде, он разбирается лучше меня.
В любом случае можете попборовать и так и так. На безопастность это не влияет. В худщем случае - в serial будут видны ложные "срабатывания", и только.
>Извините, хотел как проще.
Если не хотите ветку засирать "длинными простынями скетчей" - можно код вставлять в "свернутом виде". На вкладке "дополнительно".
Тут есть картинки где это делать http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
И, еще. Постарайтесь не вписывать свой комментарий к коду, внутрь своего кода. Пользуйтесь кнопкой "Предпросмотр". Во первых он там менее заметен, во вторых мешает скопировать код и вставить в свою arduinoIDE, не дает скомпилировать.
Я бы, что-бы было удобнее читать в мониторе, выводил вот так пины
Serial.print("Light:"); Serial.print(digitalRead(SmallLightPin)); Serial.print(", Break:"); Serial.println(digitalRead(HandBreakPin)); delay(1000);Ну и если уж, совсем попридиратся, пины лучше объявлять не переменными (так как они никогда не меняются), а через #define
#define HandBreakPin 4 // тормозной пин
Вообщем-то не существенно, на пару байт памяти - экономия на каждом пине. И пара тактов при вызове функции (не нужно читать переменную).
И дебаг, то же можно сделать (если вы не собираетесь включать/выключать этот режим "на ходу", а только в момент компиляции скетча
#define DEBUG 1
тогда "отладочную логику" - тоже можно сделать на препроцессорных диррективах
#if DEBUG Serial.print("Light:"); Serial.print(digitalRead(SmallLightPin)); Serial.print(", Break:"); Serial.println(digitalRead(HandBreakPin)); delay(1000); #endifТогде, когда вы сделатте #define DEBUG 0
этот кусок кода вообще проигнорируется компилятором и не будет занимать память. Для ArduinoIDE он перестанет существовать, до тех пор пока DEBUG опять не объявят как 1.
И хорошо бы, все-таки, увидеть скетч целиком (вы что, стесняетесь? или там копирайт великий?) . В функциях SpeedImpulse_on, TahometrImpulse_on - тоже можно выстрелить себе в ногу. От которой ваша логика "при отладке пока не использую" может поломатся.
Уф. Да, учту все твои предложения.
Что касается скетча в полном объеме, у меня там мусора много, комментариев, закомметированных мест, пометок - что не забыть и т.д. Копирайты ни при чем :), просто ругать будете за засорение
Ну а функции (относительно без мусора) , вот они, критика приветсвуется:
// обработчик событий тахометра void TahometrImpulse_on() //сидит на прерывании 0, срабатывает при возникновении событий на 2 цифровом входе { //TimeImpulse1= Tahometr_impulse_count++; //увеличить счетчик импульсов //Speed=0; if (Tahometr_impulse_count >=2) //2имп=1 оборот коленвала { Taho_ImpulseTime = micros()-Taho_time; //время прихода между импульсами Taho_time = micros(); //обнулить Taho=((Tahometr_impulse_count*60*1000000)/(2*Taho_ImpulseTime)); // перевод в об/мин, формула универсальна для Тигго, 1 об на 2 ммпульса,1000000 - перевод мкс в сек., 60 - перевод сек в мин. if (DEBUG) { //Serial.println(Taho_ImpulseTime); Serial.println(Taho); } Tahometr_impulse_count = 0; } } // обработчик событий датчика скорости void SpeedImpulse_on() //сидит на прерывании 1, срабатывает при возникновении событий на 3 цифровом входе { //TimeImpulse1= Speed_impulse_count++; //увеличить счетчик импульсов //Speed=0; if (Speed_impulse_count >=2) //2имп=0,8м 5имп=2м { Speed_ImpulseTime = micros()-Speed_time; //время прихода между импульсами Speed_time = micros(); //обнулить Speed=((Speed_impulse_count*2*3.6*1000000)/(5*Speed_ImpulseTime)); // перевод в км/ч, формула универсальна для Тигго, 2=2м за 5 ммпульсов, 3.6 - перевод м/с в км/ч, 1000000 - перевод мкс в сек., 5 - 5 импульсов if (DEBUG) { //Serial.println(Speed_ImpulseTime); //Serial.println(Speed); } Speed_impulse_count = 0; } }Все. Утомили. Больше талдычить "дайте скетч целиком" - не буду. Кому это нужно, вам или мне?
Вы все время что-то пытаетесь "сократить", вы уверены что "то что вы скрыли" - не играет роли?
Например строчка
Tahometr_impulse_count++;
Может вызывать пробелемы если переменную Tahometr_impulse_count объявили без ключевого слова volatile. Как ее объявили - не ведомо. Партизан на допросе цедит ответы сквозь зубы.
По тому что "видно".
Serial.print в функциях обработки переменных - вызывать нельзя. Это "слишком долгая операция".
Во вторых: логика функций-обработчиков должна быть минимальная. Нужно выйти из этой функции быстро, как только возможно. Она же прервала нормальный поток. Запретила все прерывания и т.п. В ней нужно делать только "самое необходимое" - увеличивать счетчик, взводить, если нужно, какой-нибудь флаг указывающий что было прерывание. А все расчеты, Serial.print и т.п. - делать внутри loop, глядя на эти счетчики и флаги.
Правда для этого - прийдется отказаться от использования delay внутри loop, везде использовать только функцию millis(). Loop должен крутиться "без запоров". Как можно быстрее и чаще. Что-бы возникала иллюзия "одновременности".
Извиняюсь, еще раз, вот весь скетч, но со всем мусором.
Этот скетч набор функционала пока не связанного друг с другом.
В планах скетс будет управлять переключением КПП, видеокамер, света
Библиотека Mystepper.h аналог stepper.h (убрано удержание ШД)
#include <EEPROM.h> //#include <MsTimer2.h> #include <Mystepper.h> boolean DEBUG=true; // используется при отладке ////// ********Описание периферии********** /////////// int HandBreakPin=0;// Контакт 0 для сигнала от ручного тормоза int SmallLightPin=1;// Контакт 1 для сигнала от габаритов int TahometrPin = 2; // Контакт 2 для тахометра !!!!!!!!! ПРЕРЫВАНИЕ 0 int SpeedSensorPin = 3; // Контакт 3 для датчика скорости !!!!!!!!!ПРЕРЫВАНИЕ 1 // Контакт 4 для реле 1 блока-реле1 // Контакт 5 для реле 2 блока-реле1 // Контакт 6 для реле 3 блока-реле1 // Контакт 7 для реле 4 блока-реле1 int AntiHackSwitchPin=8; // Контакт 8 для противоугонки int SpeakerSwitchPin=9;// Контакт 9 для выключателя звука int SpeakerPin=10; // Контакт 10 для динамика int AFKSwitchPin=11;// Контакт 11 для кнопки АФК (автоматич. функц. контроль) // Контакт 12 для int LedPin = 13; // Контакт 13 для светодиода // Контакт 14 для реле 5 блока-реле1 // Контакт 15 для реле 6 блока-реле1 // Контакт 16 для реле 7 блока-реле1 // Контакт 17 для реле 8 блока-реле1 // Контакт 18 для !!!!!!!!!ПРЕРЫВАНИЕ 5 // Контакт 19 для !!!!!!!!!ПРЕРЫВАНИЕ 4 int ClutchONButtonPin=20;// Контакт 20 для кнопки выжима сцепления NO !!!!!!!!!ПРЕРЫВАНИЕ 3 int ClutchOFFButtonPin=21;// Контакт 21 для кнопки отжима сцепления NC !!!!!!!!!ПРЕРЫВАНИЕ 2 int Motor1HallSensor1Pin = 22;// Контакт 22 для датчика холла1 первого привода int Motor1HallSensor2Pin = 23;// Контакт 23 для датчика холла2 первого привода int Motor1HallSensor3Pin = 24;// Контакт 24 для датчика холла3 первого привода // Контакт 25 для // Контакт 26 для int Motor2HallSensor4Pin = 27;// Контакт 27 для датчика холла4 второго привода int Motor2HallSensor5Pin = 28;// Контакт 28 для датчика холла5 второго привода int Motor2HallSensor6Pin = 29;// Контакт 29 для датчика холла6 второго привода int HoldGearButtonPin = 30; // Контакт 30 для кнопки удержания передачи при выжиме сцепления int NetralGearButtonPin =31;// Контакт 31 для кнопки включения нейтрали int P1GearButtonPin=32;// Контакт 32 для кнопки включения 1ой передачи int P2GearButtonPin=33;// Контакт 33 для кнопки включения 2ой передачи int P3GearButtonPin=34;// Контакт 34 для кнопки включения 3ей передачи int P4GearButtonPin=35;// Контакт 35 для кнопки включения 4ой передачи int P5GearButtonPin=36;// Контакт 36 для кнопки включения 5ой передачи int RearGearButtonPin=37;// Контакт 37 для кнопки включения заднего хода int LCDGear1_Indicate_Pin=38;// Контакт 38 для индикации Передачи 1 на ЖКИ int LCDGear2_Indicate_Pin=39;// Контакт 39 для индикации Передачи 2 на ЖКИ int LCDGear3_Indicate_Pin=40;// Контакт 40 для индикации Передачи 3 на ЖКИ int LCDGear4_Indicate_Pin=41;// Контакт 41 для индикации Передачи 4 на ЖКИ int LCDGearD_Indicate_Pin=42;// Контакт 42 для индикации Передачи D на ЖКИ int LCDGearN_Indicate_Pin=43;// Контакт 43 для индикации Передачи N на ЖКИ int LCDGearR_Indicate_Pin=44;// Контакт 44 для индикации Передачи R на ЖКИ int LCDGearP_Indicate_Pin=45;// Контакт 45 для индикации Передачи P на ЖКИ int Motor1_Rotate_Side_Pin = 46;// Контакт 46 для первого привода - направление вращения int Motor1_Online_Direct_Pin = 47;// Контакт 47 для первого привода - прямое управление int Motor1_Frequency_Pin = 48;// Контакт 48 для первого привода - частота импульсов int Motor1B2Pin = 49;// Контакт 49 для первого привода !!!!!!!!! свободно int Motor2A1Pin = 50;// Контакт 50 для второго привода int Motor2B1Pin = 51;// Контакт 51 для второго привода int Motor2A2Pin = 52;// Контакт 52 для второго привода int Motor2B2Pin = 53;// Контакт 53 для второго привода //Stepper Motor1(200, Motor1_Rotate_Side_Pin, Motor1_Frequency_Pin, Motor1_Online_Direct_Pin, Motor1B2Pin); Stepper Motor1(200, Motor1_Rotate_Side_Pin, Motor1_Online_Direct_Pin, Motor1_Frequency_Pin, Motor1B2Pin); Stepper Motor2(200, Motor2A1Pin, Motor2B1Pin, Motor2A2Pin, Motor2B2Pin); //аналоговые входы int WheelButtonsPin = 0; //A0 // кнопки руля int OsscillographPin = 1; //A1 // осциллограф int CurrentSensor1Pin = 2; //A2 //датчик тока1 int CurrentSensor2Pin = 3; //A3 //датчик тока2 int CurrentSensor1Value=0; int CurrentSensor2Value=0; //описание переменных //boolean RelayOn = false; unsigned long Speed_ImpulseTime = 0; // время между импульсами датчика скорости unsigned long Speed_time=0; // время для отсчета импульсов int Speed_impulse_count = 0; // кол-во импульсов датчика скорости float Speed=0; // скорость с датчика скорости unsigned long Taho_ImpulseTime = 0; // время между импульсами тахометра unsigned long Taho_time=0; // время для отсчета импульсов int Tahometr_impulse_count = 0; // кол-во импульсов тахометра float Taho=0; // обороты двигателя char CurGear='0'; char LastGear='0'; char RecommendGear='0'; byte Motor1_P_135=1; // соответствует положению 1 (датчик холла1) привода 1 - 1,3,5 передачи byte Motor1_P_Netral=2; // соответствует положению 2 (датчик холла2) привода 1 - нейтраль byte Motor1_P_24R=3; // соответствует положению 3 (датчик холла3) привода 1 - 2,4,R передачи byte Motor2_P_12=4; // соответствует положению 4 (датчик холла4) привода 2 - 1,2 передачи byte Motor2_P_34=5; // соответствует положению 5 (датчик холла5) привода 2 - 3,4 передачи byte Motor2_P_5R=6; // соответствует положению 6 (датчик холла6) привода 2 - 5,R передачи int EEPROMaddrLastMotor1HallSensorNum=0; //адрес в энергонезавсимой памяти куда заносится значение положение привода 1 согласно датчикам холла 1,2 или 3 int EEPROMaddrLastMotor2HallSensorNum=1; //адрес в энергонезавсимой памяти куда заносится значение положение привода 2 согласно датчикам холла 4,5 или 6 // переменные нажатия рулевых кнопок unsigned long math_time,old_time,real_time, res_dt1, res_d; int LIMIT=10; char ButtonName='X'; // +, -, >, R=>>|, L=|<<, S=SRC, X=None // переменные нажатия рулевых кнопок - конец //общие настройки void setup() { // MsTimer2::set(500, Timer2_Timer); // таймер будет срабатывать через каждые 500ms // MsTimer2::start();//запустить таймер //0 pinMode(HandBreakPin, INPUT);// Контакт для сигнала от ручного тормоза digitalWrite(HandBreakPin, HIGH); //внутренняя подтяжка входа +++++ //1 pinMode(SmallLightPin, INPUT);// Контакт для сигнала от габаритов digitalWrite(SmallLightPin, HIGH); //внутренняя подтяжка входа +++++ //2 pinMode(TahometrPin, INPUT); // Контакт для тахометра !!!!!!!!!ПРЕРЫВАНИЕ 0 digitalWrite(TahometrPin, HIGH); //внутренняя подтяжка входа тахометра attachInterrupt(0, TahometrImpulse_on, FALLING); // настройка прерывания и функции на него //3 pinMode(SpeedSensorPin, INPUT); // Контакт для датчика скорости !!!!!!!!!ПРЕРЫВАНИЕ 1 digitalWrite(SpeedSensorPin, HIGH); //внутренняя подтяжка входа датчика скорости attachInterrupt(1, SpeedImpulse_on, FALLING); // настройка прерывания и функции на него // Контакт 4 для // Контакт 5 для // Контакт 6 для // Контакт 7 для //pinMode(SpeakerPin, OUTPUT); // Контакт для динамика //pinMode(SpeakerSwitchPin, INPUT);// Контакт для выключателя звука //digitalWrite(SpeakerSwitchPin, HIGH); //внутренняя подтяжка входа +++++ //pinMode(AntiHackSwitchPin, INPUT); // Контакт для противоугонки //digitalWrite(AntiHackSwitchPin, HIGH); //внутренняя подтяжка входа +++++ //pinMode(AFKSwitchPin, INPUT);// Контакт для кнопки АФК (автоматич. функц. контроль) //digitalWrite(AFKSwitchPin, HIGH); //внутренняя подтяжка входа +++++ // Контакт 12 для pinMode(LedPin, OUTPUT); // Контакт для светодиода // Контакт 14 для // Контакт 15 для // Контакт 16 для кнопки + повышения передач // Контакт 17 для кнопки - понижения передач // Контакт 18 для !!!!!!!!!ПРЕРЫВАНИЕ 5 // Контакт 19 для !!!!!!!!!ПРЕРЫВАНИЕ 4 pinMode(ClutchONButtonPin, INPUT);// Контакт для кнопки выжима сцепления NO !!!!!!!!!ПРЕРЫВАНИЕ 3 digitalWrite(ClutchONButtonPin, HIGH); //внутренняя подтяжка входа +++++ pinMode(ClutchOFFButtonPin, INPUT);// Контакт для кнопки отжима сцепления NC !!!!!!!!!ПРЕРЫВАНИЕ 2 digitalWrite(ClutchOFFButtonPin, HIGH); //внутренняя подтяжка входа +++++ pinMode(Motor1HallSensor1Pin, INPUT);// Контакт для датчика холла1 первого привода digitalWrite(Motor1HallSensor1Pin, HIGH); //внутренняя подтяжка входа +++++ pinMode(Motor1HallSensor2Pin, INPUT);// Контакт для датчика холла2 первого привода digitalWrite(Motor1HallSensor2Pin, HIGH); //внутренняя подтяжка входа +++++ pinMode(Motor1HallSensor3Pin, INPUT);// Контакт для датчика холла3 первого привода digitalWrite(Motor1HallSensor3Pin, HIGH); //внутренняя подтяжка входа +++++ // Контакт 25 для // Контакт 26 для pinMode(Motor2HallSensor4Pin, INPUT);// Контакт для датчика холла4 второго привода digitalWrite(Motor2HallSensor4Pin, HIGH); //внутренняя подтяжка входа +++++ pinMode(Motor2HallSensor5Pin, INPUT);// Контакт для датчика холла5 второго привода digitalWrite(Motor2HallSensor5Pin, HIGH); //внутренняя подтяжка входа +++++ pinMode(Motor2HallSensor6Pin, INPUT);// Контакт для датчика холла6 второго привода digitalWrite(Motor2HallSensor6Pin, HIGH); //внутренняя подтяжка входа +++++ pinMode(HoldGearButtonPin, INPUT); // Контакт для кнопки удержания передачи при выжиме сцепления digitalWrite(HoldGearButtonPin, HIGH); //внутренняя подтяжка входа +++++ pinMode(NetralGearButtonPin, INPUT);// Контакт для кнопки включения нейтрали digitalWrite(NetralGearButtonPin, HIGH); //внутренняя подтяжка входа +++++ pinMode(P1GearButtonPin, INPUT);// Контакт для кнопки включения 1ой передачи digitalWrite(P1GearButtonPin, HIGH); //внутренняя подтяжка входа +++++ pinMode(P2GearButtonPin, INPUT);// Контакт для кнопки включения 2ой передачи digitalWrite(P2GearButtonPin, HIGH); //внутренняя подтяжка входа +++++ pinMode(P3GearButtonPin, INPUT);// Контакт для кнопки включения 3ей передачи digitalWrite(P3GearButtonPin, HIGH); //внутренняя подтяжка входа +++++ pinMode(P4GearButtonPin, INPUT);// Контакт для кнопки включения 4ой передачи digitalWrite(P4GearButtonPin, HIGH); //внутренняя подтяжка входа +++++ pinMode(P5GearButtonPin, INPUT);// Контакт для кнопки включения 5ой передачи digitalWrite(P5GearButtonPin, HIGH); //внутренняя подтяжка входа +++++ pinMode(RearGearButtonPin, INPUT);// Контакт для кнопки включения заднего хода digitalWrite(RearGearButtonPin, HIGH); //внутренняя подтяжка входа +++++ pinMode(LCDGear1_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи 1 на ЖКИ pinMode(LCDGear2_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи 2 на ЖКИ pinMode(LCDGear3_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи 3 на ЖКИ pinMode(LCDGear4_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи 4 на ЖКИ pinMode(LCDGearD_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи D на ЖКИ pinMode(LCDGearN_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи N на ЖКИ pinMode(LCDGearR_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи R на ЖКИ pinMode(LCDGearP_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи P на ЖКИ pinMode(Motor1_Rotate_Side_Pin, OUTPUT);// Контакт для Реле1 первого привода pinMode(Motor1_Online_Direct_Pin, OUTPUT);// Контакт для Реле2 первого привода pinMode(Motor1_Frequency_Pin, OUTPUT);// Контакт для Реле3 первого привода pinMode(Motor1B2Pin, OUTPUT);// Контакт для Реле4 первого привода pinMode(Motor2A1Pin, OUTPUT);// Контакт для Реле5 второго привода pinMode(Motor2B1Pin, OUTPUT);// Контакт для Реле6 второго привода pinMode(Motor2A2Pin, OUTPUT);// Контакт для Реле7 второго привода pinMode(Motor2B2Pin, OUTPUT);// Контакт для Реле8 второго привода // параметры моторов, скорости вращения об/мин Motor1.setSpeed(100); Motor2.setSpeed(300); //гасим ЖКИ /* digitalWrite(LCDGear1_Indicate_Pin, LOW); digitalWrite(LCDGear2_Indicate_Pin, LOW); digitalWrite(LCDGear3_Indicate_Pin, LOW); digitalWrite(LCDGear4_Indicate_Pin, LOW); digitalWrite(LCDGearD_Indicate_Pin, LOW); digitalWrite(LCDGearN_Indicate_Pin, LOW); digitalWrite(LCDGearR_Indicate_Pin, LOW); digitalWrite(LCDGearP_Indicate_Pin, LOW); */ // if (DEBUG) { Serial.begin(115200); } } void Indicate_Recommended_Gear(float Speed_kmh) { if (Speed_kmh<=0) {RecommendGear='N';} // реле N if ((Speed_kmh>0) && (Speed_kmh<=7)) {RecommendGear='1';} // реле 1 if ((Speed_kmh>10) && (Speed_kmh<=22)) {RecommendGear='2';} // реле 2 if ((Speed_kmh>25) && (Speed_kmh<=40)) {RecommendGear='3';} // реле 3 if ((Speed_kmh>43) && (Speed_kmh<=85)) {RecommendGear='4';} // реле 4 if (Speed_kmh>90) {RecommendGear='D';} // реле 5 if (LastGear!=RecommendGear) { if (LastGear=='1'){digitalWrite(LCDGear1_Indicate_Pin, HIGH);} if (LastGear=='2'){digitalWrite(LCDGear2_Indicate_Pin, HIGH);} if (LastGear=='3'){digitalWrite(LCDGear3_Indicate_Pin, HIGH);} if (LastGear=='4'){digitalWrite(LCDGear4_Indicate_Pin, HIGH);} if (LastGear=='D'){digitalWrite(LCDGearD_Indicate_Pin, HIGH);} if (LastGear=='N'){digitalWrite(LCDGearN_Indicate_Pin, HIGH);} if (LastGear=='R'){digitalWrite(LCDGearR_Indicate_Pin, HIGH);} if (LastGear=='P'){digitalWrite(LCDGearP_Indicate_Pin, HIGH);} if (RecommendGear=='1'){digitalWrite(LCDGear1_Indicate_Pin, LOW);} if (RecommendGear=='2'){digitalWrite(LCDGear2_Indicate_Pin, LOW);} if (RecommendGear=='3'){digitalWrite(LCDGear3_Indicate_Pin, LOW);} if (RecommendGear=='4'){digitalWrite(LCDGear4_Indicate_Pin, LOW);} if (RecommendGear=='D'){digitalWrite(LCDGearD_Indicate_Pin, LOW);} if (RecommendGear=='N'){digitalWrite(LCDGearN_Indicate_Pin, LOW);} if (RecommendGear=='R'){digitalWrite(LCDGearR_Indicate_Pin, LOW);} if (RecommendGear=='P'){digitalWrite(LCDGearP_Indicate_Pin, LOW);} LastGear=RecommendGear; } } // главный цикл void Gear_motor_step(int steps) { if (steps>0) {digitalWrite(Motor1_Rotate_Side_Pin, HIGH);} // задаем сторону вращения if (steps<0) {digitalWrite(Motor1_Rotate_Side_Pin, LOW);} // задаем сторону вращения digitalWrite(Motor1_Online_Direct_Pin, HIGH); // прямое управление контроллером шагового двигателя с ардуино int TimeBTWNImpulse=3000; //время между импульсами (шагами) - скорость вращения int ttime=millis(); int stepped=1; int stepcount=abs(steps); while (stepped<=stepcount) { if (stepped>50) {TimeBTWNImpulse=2000;} //ускорение 1ая ступень if (stepped>100) {TimeBTWNImpulse=1500;} //ускорение 2ая ступень if (stepped>150) {TimeBTWNImpulse=1000;} //ускорение 3ья ступень digitalWrite(Motor1_Frequency_Pin, HIGH); //импульс delayMicroseconds(TimeBTWNImpulse); digitalWrite(Motor1_Frequency_Pin, LOW); // Serial.println(gear_motor_step_number); stepped++; } digitalWrite(Motor1_Frequency_Pin, LOW); Serial.println( millis()-ttime); } void loop() { digitalWrite(LCDGear1_Indicate_Pin, LOW); digitalWrite(LCDGear2_Indicate_Pin, LOW); digitalWrite(LCDGear3_Indicate_Pin, LOW); digitalWrite(LCDGear4_Indicate_Pin, LOW); digitalWrite(LCDGearD_Indicate_Pin, LOW); digitalWrite(LCDGearN_Indicate_Pin, LOW); digitalWrite(LCDGearR_Indicate_Pin, LOW); digitalWrite(LCDGearP_Indicate_Pin, LOW); digitalWrite(LCDGear1_Indicate_Pin, HIGH); delay(2000); digitalWrite(LCDGear1_Indicate_Pin, LOW); digitalWrite(LCDGear2_Indicate_Pin, LOW); digitalWrite(LCDGear3_Indicate_Pin, LOW); digitalWrite(LCDGear4_Indicate_Pin, LOW); digitalWrite(LCDGearD_Indicate_Pin, LOW); digitalWrite(LCDGearN_Indicate_Pin, LOW); digitalWrite(LCDGearR_Indicate_Pin, LOW); digitalWrite(LCDGearP_Indicate_Pin, LOW); digitalWrite(LCDGear2_Indicate_Pin, HIGH); delay(2000); digitalWrite(LCDGear1_Indicate_Pin, LOW); digitalWrite(LCDGear2_Indicate_Pin, LOW); digitalWrite(LCDGear3_Indicate_Pin, LOW); digitalWrite(LCDGear4_Indicate_Pin, LOW); digitalWrite(LCDGearD_Indicate_Pin, LOW); digitalWrite(LCDGearN_Indicate_Pin, LOW); digitalWrite(LCDGearR_Indicate_Pin, LOW); digitalWrite(LCDGearP_Indicate_Pin, LOW); digitalWrite(LCDGear3_Indicate_Pin, HIGH); delay(2000); digitalWrite(LCDGear1_Indicate_Pin, LOW); digitalWrite(LCDGear2_Indicate_Pin, LOW); digitalWrite(LCDGear3_Indicate_Pin, LOW); digitalWrite(LCDGear4_Indicate_Pin, LOW); digitalWrite(LCDGearD_Indicate_Pin, LOW); digitalWrite(LCDGearN_Indicate_Pin, LOW); digitalWrite(LCDGearR_Indicate_Pin, LOW); digitalWrite(LCDGearP_Indicate_Pin, LOW); digitalWrite(LCDGear4_Indicate_Pin, HIGH); delay(2000); digitalWrite(LCDGearD_Indicate_Pin, HIGH); delay(2000); digitalWrite(LCDGear1_Indicate_Pin, LOW); digitalWrite(LCDGear2_Indicate_Pin, LOW); digitalWrite(LCDGear3_Indicate_Pin, LOW); digitalWrite(LCDGear4_Indicate_Pin, LOW); digitalWrite(LCDGearD_Indicate_Pin, LOW); digitalWrite(LCDGearN_Indicate_Pin, LOW); digitalWrite(LCDGearR_Indicate_Pin, LOW); digitalWrite(LCDGearP_Indicate_Pin, LOW); digitalWrite(LCDGearN_Indicate_Pin, HIGH); delay(2000); digitalWrite(LCDGear1_Indicate_Pin, LOW); digitalWrite(LCDGear2_Indicate_Pin, LOW); digitalWrite(LCDGear3_Indicate_Pin, LOW); digitalWrite(LCDGear4_Indicate_Pin, LOW); digitalWrite(LCDGearD_Indicate_Pin, LOW); digitalWrite(LCDGearN_Indicate_Pin, LOW); digitalWrite(LCDGearR_Indicate_Pin, LOW); digitalWrite(LCDGearP_Indicate_Pin, LOW); digitalWrite(LCDGearR_Indicate_Pin, HIGH); delay(2000); digitalWrite(LCDGear1_Indicate_Pin, LOW); digitalWrite(LCDGear2_Indicate_Pin, LOW); digitalWrite(LCDGear3_Indicate_Pin, LOW); digitalWrite(LCDGear4_Indicate_Pin, LOW); digitalWrite(LCDGearD_Indicate_Pin, LOW); digitalWrite(LCDGearN_Indicate_Pin, LOW); digitalWrite(LCDGearR_Indicate_Pin, LOW); digitalWrite(LCDGearP_Indicate_Pin, LOW); digitalWrite(LCDGearP_Indicate_Pin, HIGH); delay(2000); //Serial.println(digitalRead(Motor2HallSensor4Pin)); //delay(100); //!!!!!!!!!!!!!!! /*!!!!!!!!!! delay(2000); //Motor2.step(100, Motor2HallSensor6Pin); if (digitalRead(Motor2HallSensor5Pin)==1) { Motor2.step(-600, Motor2HallSensor5Pin); } delay(2000); if (digitalRead(Motor2HallSensor4Pin)==1) { Motor2.step(600, Motor2HallSensor4Pin); } */ // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /* delay(2000); int ttime=millis(); Motor1.step(280, Motor2HallSensor6Pin); Serial.println( millis()-ttime); delay(2000); Motor1.step(-280, Motor2HallSensor6Pin); delay(2000); Motor1.step(-280, Motor2HallSensor6Pin); delay(2000); Motor1.step(280, Motor2HallSensor6Pin); */ /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! с ускорением Gear_motor_step(220); delay(2000); Gear_motor_step(220); delay(2000); Gear_motor_step(-220); delay(2000); Gear_motor_step(-220); delay(2000); */ /* int Motor1_Rotate_Side_Pin = 46;// Контакт 46 для первого привода - направление вращения int Motor1_Online_Direct_Pin = 47;// Контакт 47 для первого привода - прямое управление int Motor1_Frequency_Pin = 48;// Контакт 48 для первого привода - частота импульсов digitalWrite(47, HIGH); // прямое управление digitalWrite(Motor1_Rotate_Side_Pin, HIGH); //вращ лев прав digitalWrite(48, HIGH); //импульс delay(3); digitalWrite(48, LOW); delay(3); */ /* digitalWrite(47, HIGH); digitalWrite(Motor1_Rotate_Side_Pin, HIGH); delay(1000); digitalWrite(47, HIGH); digitalWrite(Motor1_Rotate_Side_Pin, LOW); delay(1000); */ //digitalWrite(LCDGear2_Indicate_Pin, LOW); //delay(1000); if (DEBUG) { // Serial.println(digitalRead(Motor2HallSensor5Pin)); //Serial.println(digitalRead(3)); // delay(100); } //!!!!!!!!!!!!!!! /* delay(2000); Motor2.step(100, Motor2HallSensor6Pin); if (digitalRead(Motor2HallSensor5Pin)==1) { Motor2.step(220, Motor2HallSensor5Pin); } delay(2000); if (digitalRead(Motor2HallSensor4Pin)==1) { Motor2.step(-300, Motor2HallSensor4Pin); } */ /* // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! delay(2000); Motor1.step(280, Motor2HallSensor6Pin); delay(2000); Motor1.step(-280, Motor2HallSensor6Pin); delay(2000); Motor1.step(-280, Motor2HallSensor6Pin); delay(2000); Motor1.step(280, Motor2HallSensor6Pin); */ /* //!!!!!!!!!!!! Motor2.step(220); delay(1000); Motor2.step(-220); delay(1000); Motor2.step(-220); delay(1000); Motor2.step(220); delay(1000); */ /* //!!!!!!!!!!!!! Motor1.step(27); delay(1000); Motor1.step(-27); delay(1000); Motor1.step(-27); delay(1000); Motor1.step(27); delay(1000); */ //if (WheelButonPush_IsPushed()) {Serial.println(ButtonName);} // проверка нажата ли рулевая кнопка //RelayOn=HIGH; //digitalWrite(RelayPin, RelayOn); // реле включить /* if (digitalRead(SpeedSensorPin)==HIGH && digitalRead(HoldGearButtonPin)==HIGH) // датчик холла сработал и кнопка не нажата { RelayOn=LOW; digitalWrite(RelayPin, RelayOn); // реле выключить } if (digitalRead(HoldGearButtonPin)==LOW) //кнопка нажата { } */ //Indicate_Recommended_Gear(Speed); //delay(100); } // обработчик событий тахометра void TahometrImpulse_on() //сидит на прерывании 0, срабатывает при возникновении событий на 2 цифровом входе { //TimeImpulse1= Tahometr_impulse_count++; //увеличить счетчик импульсов //Speed=0; if (Tahometr_impulse_count >=2) //2имп=1 оборот коленвала { Taho_ImpulseTime = micros()-Taho_time; //время прихода между импульсами Taho_time = micros(); //обнулить Taho=((Tahometr_impulse_count*60*1000000)/(2*Taho_ImpulseTime)); // перевод в об/мин, формула универсальна для Тигго, 1 об на 2 ммпульса,1000000 - перевод мкс в сек., 60 - перевод сек в мин. if (DEBUG) { //Serial.println(Taho_ImpulseTime); Serial.println(Taho); } Tahometr_impulse_count = 0; } } // обработчик событий датчика скорости void SpeedImpulse_on() //сидит на прерывании 1, срабатывает при возникновении событий на 3 цифровом входе { //TimeImpulse1= Speed_impulse_count++; //увеличить счетчик импульсов //Speed=0; if (Speed_impulse_count >=2) //2имп=0,8м 5имп=2м { Speed_ImpulseTime = micros()-Speed_time; //время прихода между импульсами Speed_time = micros(); //обнулить Speed=((Speed_impulse_count*2*3.6*1000000)/(5*Speed_ImpulseTime)); // перевод в км/ч, формула универсальна для Тигго, 2=2м за 5 ммпульсов, 3.6 - перевод м/с в км/ч, 1000000 - перевод мкс в сек., 5 - 5 импульсов if (DEBUG) { //Serial.println(Speed_ImpulseTime); //Serial.println(Speed); } Speed_impulse_count = 0; } } // Функция проверки нажатия рулевой кнопки // Возвращает false если кнопка не была нажата // и true если нажата // ButtonName принимает значения в зависимости от нажатой кнопки +, -, >, R=>>|, L=|<<, S=SRC, X=None boolean WheelButonPush_IsPushed() { bool result; result=false; unsigned long buttonVal; buttonVal=0; ButtonName='X'; res_d = analogRead(WheelButtonsPin); if( res_d < LIMIT) res_d = LIMIT; delay(10); res_dt1 = analogRead(WheelButtonsPin); old_time = millis(); math_time = 0; while(math_time < 200) { real_time = millis(); math_time = real_time - old_time; res_dt1 = analogRead(WheelButtonsPin); if(res_dt1 < res_d-LIMIT || res_dt1 > res_d+LIMIT)break; } if( math_time > 70) { buttonVal=res_d; ButtonName='X'; // Serial.println (res_d); if ((buttonVal>25) && (buttonVal<45)) { ButtonName='-'; //35-36 result=true; } if ((buttonVal>60) && (buttonVal<85)) { ButtonName='+'; //72-73 result=true; } if ((buttonVal>110) && (buttonVal<135)) { ButtonName='S'; //122 result=true; } if ((buttonVal>175) && (buttonVal<200)) { ButtonName='R'; //187 result=true; } if ((buttonVal>275) && (buttonVal<295)) { ButtonName='L'; //285 result=true; } if ((buttonVal>415) && (buttonVal<440)) { ButtonName='>'; //429 result=true; } if ((buttonVal>645) && (buttonVal<670)) { ButtonName='X'; //658-659 result=false; } buttonVal=0; } return result; } int sensorValue = 0; // variable to store the value coming from the sensor int countvalues = 5; // how many values must be averaged int ZeroLevel = 520; // Zero level float kVolt = 0.0506; // conversion factor int Current(int sensorPin) { int TMPsensorValue = 0; int count = 0; for (count =0; count < countvalues; count++) { // read the value from the sensor: TMPsensorValue = analogRead(sensorPin); delay(30); // make average value sensorValue = (sensorValue+TMPsensorValue)/2; } return sensorValue; } void Timer2_Timer() //обработка событий в таймере { //CurrentSensor1Value = analogRead(CurrentSensor1Pin); // read analog input pin CurrentSensor1Pin //int CurrentSensor1Value = Current(CurrentSensor1Pin); // Serial.println(kVolt * (CurrentSensor1Value - ZeroLevel)); /* if (DEBUG) { // Serial.println(CurrentSensor1Value); // prints the value read Serial.println((CurrentSensor1Value-512)*1000/20); // prints the value read delay(100); // wait 100ms for next reading } */ }Ну так и есть. volatile забыли.
Глобальные переменные которые может менять функция обработчик прерывания - должны объявлятся с ним (может и без него будет работать, но сугубо от по фазе луны. если повезет). Почитайте доку http://arduino.ru/Reference/AttachInterrupt, обратите внимание на раздел ""Замечание по использованию". Там и про Serial есть, и про volatile.
Если LCDGear1_Indicate_PIN_XXX объявить как массив, то весь код можно привести в гораздо более читаемый вид. Не нужны "километровые портянки". Нужно же быть ленивым, когда нужно
Примерно так:
byte Gear_LCD_Pins[]={38,39,40,41,42,43,44,45}; #define D_idx 5 // индекс пина для индикации Передачи D на ЖКИ в массиве Gear_LCD_Pins, то есть 42-той пин, нумерация - с единицы (что-бы не заводить дефайны для 1-4-то передачи #define N_idx 6 #define R_idx 7 #define P_idx 8 //индекс пина для индикации Передачи P на ЖКИ, то есть 45-тый пин void setup(){ for(byte i=0;i<P_idx;i++)pinMode(Gear_LCD_Pins[i],OUTPUT); // одним махом выставили режим сразу для всех Gear_LCD_Pins // Включили первую lcdGearOn(1); delay(2000); lcdGearOn(3); // третью delay(2000); lcdGearOn(N_idx); // нейтралку delay(2000); lcdGearOn(P_idx); // парковку delay(2000); // а теперь пробежались вообще по всем. От первой до парковки for(byte i=1;i<=P_idx;i++){ lcdGearOn(i); delay(2000); } lcdGearOff();// выключили } void loop(){ } // выключает индикацию всех передчь void lcdGearOff(){ for(byte i=0;i<P_idx;i++)digitalWrite(Gear_LCD_Pins[i],LOW); } // включает индикацю передчи, idx - индекс передачи в массиве Gear_LCD_Pins, нумерация - с единицы void lcdGearOn(byte idx){ lcdGearOff();// на всяк случай вначале все выключим digitalWrite(Gear_LCD_Pins[idx-1],HIGH);// включили нунжный пин }Спасибо, учту все эти замечания и потом выложу на суд.
P.S. Был в командировке