Нужна помощь по програмированию "тупого железа"

p33000
Offline
Зарегистрирован: 12.07.2016

Так я только начал изучение программирования микроконтролеров и не являюсь програмистом  Нужна помощь програмированию тупого железа

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Пятница же ж. Я во всеоружии:

p33000
Offline
Зарегистрирован: 12.07.2016

прилагаю схему и проект для протеуса.

смысл такой: есть кнопки, которые необходимо подключать к двум разным резистивным каналам управления.

по умолчанию кнопки подключены к каналу 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

В программировании не соображаю т.к. образование у меня радиоинженер конструктор.

Помогите пожалуйста с кодом!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, если Вы инженер, то какие-то понятия о программировании имеете, а остальное легко освоите. Делайте, а там если чего - поможем.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

DIYMan, присоединяюсь ....к попкорну. Этот чел тоже будет говорить что на иностраных форумах благодушная атмосфера. А на русских форумах новичка собираются облить грязью.

sadman41
Offline
Зарегистрирован: 19.10.2016

Квон, а на аналоговые кнопки класса нет разве? Надо срочно завести ))

p33000
Offline
Зарегистрирован: 12.07.2016

ну начну беседу сам с собой пока. сначало я думаю пойдет блок кода по обработке клавиатуры типа такого.

#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;
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

sadman41 пишет:

Квон, а на аналоговые кнопки класса нет разве? Надо срочно завести ))

есть. Но зачем они не программистам.

p33000, неправильно вы начали писать программу. Надо начинать с алгоритма и структурной схемы. Да и освежить в памяти конечные автоматы.

sadman41
Offline
Зарегистрирован: 19.10.2016

p33000 пишет:

ну начну беседу сам с собой пока. сначало я думаю пойдет блок кода по обработке клавиатуры типа такого.

В лупе кнопку обнаружили, в переменную (типа static, например) ее запомнили. Так же запомнили время нажатия через millis(). Потом крутитесь и проверяете - сменилась активная кнопка или нет. Как сменилась - из миллиса вычитаете время нажатия и смотрите - больше 2000 разница или меньше. В зависимости от этого делаете digitalWrite на нужный выход.

p33000
Offline
Зарегистрирован: 12.07.2016

Спасибо всем откликнувшимся! Но я не могу пока с вами разговаривать на одном языке. Так как начал только изучать науку о програмировании "Великой Ардуины" и вчера в протеусе собрал схему со светодиодом.

Пример взял отсюда http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku?page=2#comment-46294

sadman41
Offline
Зарегистрирован: 19.10.2016

В таком случае ознакомьтесь с http://arduino.ru/tutorials/BlinkWithoutDelay - там найдете как время запомнить и сравнить.

p33000
Offline
Зарегистрирован: 12.07.2016

Хорошо накачал книжек буду читать. спасибо.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

В схеме сразу обнаружил херню (простите за мой франзузский) - а как будет контролироваться изменяемый параметр? Добавляйте какой нибудь HID типа табло.

p33000
Offline
Зарегистрирован: 12.07.2016

mykaida пишет:

В схеме сразу обнаружил херню (простите за мой франзузский) - а как будет контролироваться изменяемый параметр? Добавляйте какой нибудь HID типа табло.

это кнопки на руле автомобиля информация отображается на экране.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

mykaida пишет:

Добавляйте какой нибудь HID типа табло.

Табло - это не HID, тащемта.

p33000
Offline
Зарегистрирован: 12.07.2016

выходы атмеги нужно перевести в z состояние и при нажатии кнопок сажать на землю. по их сопротивлению авто компьютер определяет какая кнопка нажата.

проект очень интересный. позволит задействовать дополнительные возможности бортового компьютера или магнитолы без замены или приобретения дополнительных кнопок.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

p33000 пишет:

это кнопки на руле автомобиля информация отображается на экране.

Извините, но не в схеме, ни в ТЗ нет никакого экрана. Ну да хер с ним. А зачем вы используете резисторы кратные 100омам? А почему не килоому? Там потребление и нагрев будет меньше. И, кстати, Вы считали токи на выходе? А суммарный ток?

p33000
Offline
Зарегистрирован: 12.07.2016

вот пример на аттину по этой схеме

 

//под 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);
}
mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Замечательно! Наконец я увидел схему. А теперь вопрос - а нахера Вам нужна прокладка из контроллера, когда то же самое вы можете подать с джойстика? Помедитируйте малость, прежде чем ответить.

p33000
Offline
Зарегистрирован: 12.07.2016

смысл такой: есть кнопки, которые необходимо подключать к двум разным резистивным каналам управления.

это понятно?

кнопки дополнительные стоят 4500 рублей

идея в том чтобы не покупать кнопки, а задействовать часть из существующих.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Так какой из представленных вариантов у Вас? Нарисуйте схему того , что у Вас есть, потом что Вам надо и поймите, а нужен ли Вам контроллер или просто дополнительный переключатель. Как я понимаю у Вас Киа или Хендай?

p33000
Offline
Зарегистрирован: 12.07.2016

у меня такие кнопки

 

нужны такие

 

схма подключения на руле к бортовому компьютеру

 

p33000
Offline
Зарегистрирован: 12.07.2016

в сети есть одноканальный вариант

например здесь

http://www.mariklab.ru/joystick.html

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

#9

svm
Offline
Зарегистрирован: 06.11.2016

p33000 пишет:

прилагаю схему и проект для протеуса.

смысл такой: есть кнопки, которые необходимо подключать к двум разным резистивным каналам управления.

по умолчанию кнопки подключены к каналу 1 и при удержании более 2 сек. кнопки ОК, начинают работать со вторым каналом.

В программировании не соображаю т.к. образование у меня радиоинженер конструктор.

Помогите пожалуйста с кодом!

Если Вы инженер конструктор, то зачем Вам протеус. Соберите на макетке, сначала воткните на выхода светодиоды и смотрите все в натуре. Схема вполне рабочая. С проблемами программирования,за пару вечеров разберетесь. Главное начать. 

На всякий случай измерьте ток в цепях обоих каналов при подключении минимальныхо резисторов, не превысит-ли он максимальный для выхода ардуины. Можно учесть еще сопротивление открытого ключа выхода ардуино = 20 Ом

p33000
Offline
Зарегистрирован: 12.07.2016

так чтобы схема в железе заработала нужно прошить атмегу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 байт динамической памяти.

p33000
Offline
Зарегистрирован: 12.07.2016

Поставил как для атмега8 компиляция прошла нормально и даже заработало устройство в протеусе.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Этот расклад не будет работать на морозе. Так что купите готовое и не парьте мозг нам и себе.

p33000
Offline
Зарегистрирован: 12.07.2016

p33000
Offline
Зарегистрирован: 12.07.2016

p33000
Offline
Зарегистрирован: 12.07.2016

p33000
Offline
Зарегистрирован: 12.07.2016

p33000
Offline
Зарегистрирован: 12.07.2016
//под  тини 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);
}