Нужна помощь по програмированию "тупого железа"
- Войдите на сайт для отправки комментариев
Пт, 05/10/2018 - 20:47
Так я только начал изучение программирования микроконтролеров и не являюсь програмистом Нужна помощь програмированию тупого железа
Пятница же ж. Я во всеоружии:
прилагаю схему и проект для протеуса.
смысл такой: есть кнопки, которые необходимо подключать к двум разным резистивным каналам управления.
по умолчанию кнопки подключены к каналу 1 и при удержании более 2 сек. кнопки ОК, начинают работать со вторым каналом.
http://yadi.sk/d/O-ndVnFjPQUQqQ
режим 1
сопротивление на выходе
390 Ом — Menu
220 Ом — Up
300 Ом — Down
470 Ом — OK
режим 2
сопротивление на выходе
390 Ом — C
220 Ом -- Res+
300 Ом — Set-
490 Ом — Cancel
В программировании не соображаю т.к. образование у меня радиоинженер конструктор.
Помогите пожалуйста с кодом!
Ну, если Вы инженер, то какие-то понятия о программировании имеете, а остальное легко освоите. Делайте, а там если чего - поможем.
DIYMan, присоединяюсь ....к попкорну. Этот чел тоже будет говорить что на иностраных форумах благодушная атмосфера. А на русских форумах новичка собираются облить грязью.
Квон, а на аналоговые кнопки класса нет разве? Надо срочно завести ))
ну начну беседу сам с собой пока. сначало я думаю пойдет блок кода по обработке клавиатуры типа такого.
#define NUM_KEYS 4 int adc_key_val[NUM_KEYS] = {30, 150, 360, 535}; void setup() { Serial.begin(9600); } void loop() { int key = get_key(A0); if(key) Serial.println(key, DEC); } int get_key(int key_pin) { int input = analogRead(key_pin); int k; for(k = 0; k < NUM_KEYS; k++) if(input < adc_key_val[k]) return k + 1; return 0; }Квон, а на аналоговые кнопки класса нет разве? Надо срочно завести ))
p33000, неправильно вы начали писать программу. Надо начинать с алгоритма и структурной схемы. Да и освежить в памяти конечные автоматы.
ну начну беседу сам с собой пока. сначало я думаю пойдет блок кода по обработке клавиатуры типа такого.
В лупе кнопку обнаружили, в переменную (типа static, например) ее запомнили. Так же запомнили время нажатия через millis(). Потом крутитесь и проверяете - сменилась активная кнопка или нет. Как сменилась - из миллиса вычитаете время нажатия и смотрите - больше 2000 разница или меньше. В зависимости от этого делаете digitalWrite на нужный выход.
Спасибо всем откликнувшимся! Но я не могу пока с вами разговаривать на одном языке. Так как начал только изучать науку о програмировании "Великой Ардуины" и вчера в протеусе собрал схему со светодиодом.
Пример взял отсюда http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku?page=2#comment-46294
В таком случае ознакомьтесь с http://arduino.ru/tutorials/BlinkWithoutDelay - там найдете как время запомнить и сравнить.
Хорошо накачал книжек буду читать. спасибо.
В схеме сразу обнаружил херню (простите за мой франзузский) - а как будет контролироваться изменяемый параметр? Добавляйте какой нибудь HID типа табло.
В схеме сразу обнаружил херню (простите за мой франзузский) - а как будет контролироваться изменяемый параметр? Добавляйте какой нибудь HID типа табло.
это кнопки на руле автомобиля информация отображается на экране.
Добавляйте какой нибудь HID типа табло.
Табло - это не HID, тащемта.
выходы атмеги нужно перевести в z состояние и при нажатии кнопок сажать на землю. по их сопротивлению авто компьютер определяет какая кнопка нажата.
проект очень интересный. позволит задействовать дополнительные возможности бортового компьютера или магнитолы без замены или приобретения дополнительных кнопок.
это кнопки на руле автомобиля информация отображается на экране.
Извините, но не в схеме, ни в ТЗ нет никакого экрана. Ну да хер с ним. А зачем вы используете резисторы кратные 100омам? А почему не килоому? Там потребление и нагрев будет меньше. И, кстати, Вы считали токи на выходе? А суммарный ток?
вот пример на аттину по этой схеме
//под 45 тини и 13 тини #include <avr/io.h> //задаем начальные значение переменных int prevButton=0; // Коды имеющихся на руле кнопок const int VOL_UP=1; const int VOL_DN=2; const int PREV_TR=3; const int NEXT_TR=4; const int MODE=5; // задаем пин, на котором читаем сопротивление нажатой кнопки int wheelPin=PB3; //A5 //задаем пины выхода int V1=PB2; // 1.5к int V2=PB1; // 10к int P1=PB0; // 15к int P2=PB4; // 15к+6.2к void setup() { pinMode(wheelPin, INPUT); //выставляем порт В контроллера в режим входа (состояние Z) DDRB=0b00000000; } // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0 int getR() { // читаем сопротивление (точнее напряжение) на аналоговом пине int r=analogRead(wheelPin); // Ищем, какая кнопка соответствует этому сопротивлению. // Данные значения сопротивлений подходят для FORD, для других автомобилей числа будут другие. if (r>=22 && r<=37) return(VOL_UP); // 28 if (r>=6 && r<=18) return(VOL_DN); // 12 if (r>=85 && r<=106) return(PREV_TR); // 95 if (r>=45 && r<=65) return(NEXT_TR); // 54 if (r>=145 && r<=175) return(MODE); // 160 // если ни одна из кнопок не нажата, возвращаем 0 return (0); } // ОСНОВНОЙ ЦИКЛ void loop() { int currButton=getR(); // присваиваем currButton код нажатой кнопки if (currButton!=prevButton) // если изменилось { delay(40); currButton=getR(); // ждем 40ms и читаем еще, исключая дребезг if (currButton!=prevButton) // если код кнопки изменился { prevButton=currButton; // сохраняем новое в prevButton // Парсим код кнопки и посылаем команду на АЦП магнитолы. switch(currButton) { case VOL_UP: pinMode(P1, OUTPUT); digitalWrite(P1, LOW); break; // 16k case VOL_DN: pinMode(P2, OUTPUT); digitalWrite(P2, LOW); break; // 24k case PREV_TR: pinMode(V2, OUTPUT); digitalWrite(V2, LOW); break; // 11k case NEXT_TR:pinMode(P1, OUTPUT); pinMode(V2, OUTPUT); digitalWrite(P1, LOW); digitalWrite(V2, LOW); break; // 8k case MODE: pinMode(V1, OUTPUT); digitalWrite(V1, LOW); break; // 1.6k default: DDRB=0b00000000; break; // 0k } } } delay(5); }Замечательно! Наконец я увидел схему. А теперь вопрос - а нахера Вам нужна прокладка из контроллера, когда то же самое вы можете подать с джойстика? Помедитируйте малость, прежде чем ответить.
смысл такой: есть кнопки, которые необходимо подключать к двум разным резистивным каналам управления.
это понятно?
кнопки дополнительные стоят 4500 рублей
идея в том чтобы не покупать кнопки, а задействовать часть из существующих.
Так какой из представленных вариантов у Вас? Нарисуйте схему того , что у Вас есть, потом что Вам надо и поймите, а нужен ли Вам контроллер или просто дополнительный переключатель. Как я понимаю у Вас Киа или Хендай?
у меня такие кнопки
нужны такие
схма подключения на руле к бортовому компьютеру
в сети есть одноканальный вариант
например здесь
http://www.mariklab.ru/joystick.html
#9
прилагаю схему и проект для протеуса.
смысл такой: есть кнопки, которые необходимо подключать к двум разным резистивным каналам управления.
по умолчанию кнопки подключены к каналу 1 и при удержании более 2 сек. кнопки ОК, начинают работать со вторым каналом.
В программировании не соображаю т.к. образование у меня радиоинженер конструктор.
Помогите пожалуйста с кодом!
Если Вы инженер конструктор, то зачем Вам протеус. Соберите на макетке, сначала воткните на выхода светодиоды и смотрите все в натуре. Схема вполне рабочая. С проблемами программирования,за пару вечеров разберетесь. Главное начать.
На всякий случай измерьте ток в цепях обоих каналов при подключении минимальныхо резисторов, не превысит-ли он максимальный для выхода ардуины. Можно учесть еще сопротивление открытого ключа выхода ардуино = 20 Ом
так чтобы схема в железе заработала нужно прошить атмегу8.
погонял в протеусе одноканальную схему по ссылке выше. расчитал для analogRead показатели.
поправил в скетче по свои сопротивления, но прошивка не компилируется.
//под 45 тини и 13 тини #include <avr/io.h> //задаем начальные значение переменных int prevButton=0; // Коды имеющихся на руле кнопок const int MENU=1; const int UP=2; const int DOWN=3; const int OK=4; // задаем пин, на котором читаем сопротивление нажатой кнопки int wheelPin=PB3; //A5 //задаем пины выхода int V1=PB1; // 390 int V2=PB2; // 220 int P1=PB0; // 300 int P2=PB4; // 1.22к void setup() { pinMode(wheelPin, INPUT); //выставляем порт В контроллера в режим входа (состояние Z) DDRB=0b00000000; } // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0 int getR() { // читаем сопротивление (точнее напряжение) на аналоговом пине int r=analogRead(wheelPin); // Ищем, какая кнопка соответствует этому сопротивлению. if (r>=150 && r<=175) return(MENU); // 167 if (r>=225 && r<=245) return(UP); // 238 if (r>=290 && r<=350) return(DOWN); // 320 if (r>=390 && r<=435) return(OK); // 416 // если ни одна из кнопок не нажата, возвращаем 0 return (0); } // ОСНОВНОЙ ЦИКЛ void loop() { int currButton=getR(); // присваиваем currButton код нажатой кнопки if (currButton!=prevButton) // если изменилось { delay(40); currButton=getR(); // ждем 40ms и читаем еще, исключая дребезг if (currButton!=prevButton) // если код кнопки изменился { prevButton=currButton; // сохраняем новое в prevButton // Парсим код кнопки и посылаем команду на бортовой компьютер машины. switch(currButton) { case MENU: pinMode(V1, OUTPUT); digitalWrite(V1, LOW); break; // 390 case UP: pinMode(V2, OUTPUT); digitalWrite(V2, LOW); break; // 229 case DOWN: pinMode(P1, OUTPUT); digitalWrite(P1, LOW); break; // 300 // case R:pinMode(P2, OUTPUT); pinMode(V2, OUTPUT); digitalWrite(P1, LOW); digitalWrite(V2, LOW); break; // case OK: pinMode(P2, OUTPUT); digitalWrite(P2, LOW); break; // 1.22k default: DDRB=0b00000000; break; // 0k } } } delay(5); }может подскажите в чем дело?
Warning: Board arduino:avr:attiny85 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY85
Warning: Board arduino:avr:attiny13 doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY13
Warning: Board arduino:avr:atmega8A doesn't define a 'build.board' preference. Auto-set to: AVR_ATMEGA8A
Warning: Board attiny13:avr:attiny13e doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY13E
Warning: Board attiny13:avr:attiny13a doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY13A
Warning: Board attiny13:avr:attiny13f doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY13F
Warning: Board attiny13:avr:attiny13c doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY13C
Warning: Board attiny13:avr:attiny13d doesn't define a 'build.board' preference. Auto-set to: AVR_ATTINY13D
Внимание: platform.txt из ядра 'Attiny13' содержит устаревшие compiler.path={runtime.ide.path}/hardware/tools/avr/bin/, автоматически преобразовано в compiler.path={runtime.tools.avr-gcc.path}/bin/. Ожидайте обновления ядра.
Внимание: platform.txt из ядра 'Attiny13' содержит устаревшие tools.avrdude.cmd.path={runtime.ide.path}/hardware/tools/avr/bin/avrdude, автоматически преобразовано в tools.avrdude.cmd.path={path}/bin/avrdude. Ожидайте обновления ядра.
Внимание: platform.txt из ядра 'Attiny13' содержит устаревшие tools.avrdude.config.path={runtime.ide.path}/hardware/tools/avr/etc/avrdude.conf, автоматически преобразовано в tools.avrdude.config.path={path}/etc/avrdude.conf. Ожидайте обновления ядра.
Внимание: platform.txt из ядра 'Attiny13' содержит устаревшие recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/{archive_file}" "{object_file}", автоматически преобразовано в recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}". Ожидайте обновления ядра.
Файл загрузчика указан но не существует: C:\Program Files\arduino\hardware\attiny13\avr\bootloaders\empty
Скетч использует 606 байт (59%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 16 байт динамической памяти.
Поставил как для атмега8 компиляция прошла нормально и даже заработало устройство в протеусе.
Этот расклад не будет работать на морозе. Так что купите готовое и не парьте мозг нам и себе.
//под тини 44 84 #include <avr/io.h> //задаем начальные значение переменных int prevButton = 0; // int shift = false; // // Коды имеющихся на руле кнопок const int MENU = 1; const int UP = 2; const int DOWN = 3; const int OK = 4; // задаем пин, на котором читаем сопротивление нажатой кнопки int wheelPin = 0; // //задаем пины выхода int C1 = 8; // 390 int C2 = 7; // 220 int C3 = 6; // 300 int C4 = 5; // 470 int K1 = 4; // 390 int K2 = 3; // 220 int K3 = 2; // 300 int K4 = 1; // 1.22к void setup() { pinMode(wheelPin, INPUT); //выставляем порт В контроллера в режим входа (состояние Z) DDRB = 0b00000000; DDRA = 0B00000000; } // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0 int getR() { // читаем сопротивление (точнее напряжение) на аналоговом пине int r = analogRead(wheelPin); // Ищем, какая кнопка соответствует этому сопротивлению. поттягивающий резистор 1к if (r >= 270 && r <= 310) return (MENU); // 285 if (r >= 350 && r <= 400) return (UP); // 344 if (r >= 450 && r <= 520) return (DOWN); // 485 if (r >= 560 && r <= 625) return (OK); // 600 // если ни одна из кнопок не нажата, возвращаем 0 return (0); } // ОСНОВНОЙ ЦИКЛ void loop() { int currButton = getR(); // присваиваем currButton код нажатой кнопки if (currButton != prevButton) // если изменилось { delay(40); currButton = getR(); // ждем 40ms и читаем еще, исключая дребезг if (currButton != prevButton) // если код кнопки изменился { prevButton = currButton; // сохраняем новое в prevButton // Парсим код кнопки и посылаем команду на бортовой компьютер машины. switch (currButton) { case MENU: if (shift == false) { pinMode(C1, OUTPUT); digitalWrite(C1, LOW); break; // 390 } else { pinMode(K1, OUTPUT); digitalWrite(K1, LOW); break; // 390 } case UP: if (shift == false) { pinMode(C2, OUTPUT); digitalWrite(C2, LOW); break; // 220 } else { pinMode(K2, OUTPUT); digitalWrite(K2, LOW); break; // 220 } case DOWN: if (shift == false) { pinMode(C3, OUTPUT); digitalWrite(C4, LOW); break; // 300 } else { pinMode(K3, OUTPUT); digitalWrite(K3, LOW); break; // 300 } case OK: if (shift == false) { pinMode(C4, OUTPUT); digitalWrite(C4, LOW); break; // 1.22k } else { pinMode(K4, OUTPUT); digitalWrite(K4, LOW); break; // 1.22k } default: DDRB = 0b00000000; DDRA = 0b00000000; break; // 0k } } } delay(5); }