PCCar.ru - Ваш автомобильный компьютер

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > AndroidCar > Дополнительные устройства

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2017, 16:22   #771
Chois
Новый Пользователь
 
Регистрация: 25.02.2015
Регион: Беларусь
Машина: VW Golf IV
Сообщений: 15
Chois is on a distinguished road
По умолчанию

добрый день!
помогите написать скетч
хочется оставить управление магнитолой и дополнительно ТОЛЬКО переключать треки на планшете (т.е. только 2-е кнопки TR_NEXT, TR_PREW)
МСР 4131 нет в городе, купил МСР4231 (он 2-х канальный)

Nexus 7 12г. прошивка Тимура (зарядка+отг)
Arduino Leonardo
MCP4231 - 2-х канальный цифровой потенциометр (другой не нашел)

Sketch led - скетч который у меня работает
sketch potten - скетч не работает (наверно потому что там нет "byte addressRedLED = B00010000; " выбор канала наверно) https://mysku.ru/blog/ebay/35610.html
sketch nexus - работает (без подключенной магнитолы) уважаемого lti1
в программировании вообще не шарю, помогите пожалуйста!
схема подключения
https://prnt.sc/g0y2a9
Вложения
Тип файла: txt Sketch LED.txt (463 байт, 893 просмотров)
Тип файла: txt sketch Potten.txt (2.5 Кб, 919 просмотров)
Тип файла: txt sketch NEXUS.txt (6.2 Кб, 911 просмотров)
Chois вне форума   Ответить с цитированием
Старый 29.07.2017, 23:59   #772
Chois
Новый Пользователь
 
Регистрация: 25.02.2015
Регион: Беларусь
Машина: VW Golf IV
Сообщений: 15
Chois is on a distinguished road
По умолчанию

вот что у меня получилось (может и коряво, но главное работает)
Код:
#include <SPI.h>
// библиотека SPI должна быть в стандартном софте, ну или её можно скачать.

const byte POT = B00010000; //выбор канала потенциометра

// Коды имеющихся на руле кнопок
const int next=6;
const int previous=54;
const int vol_up=140;

int csPin=10; // CS на цифровом потенциометре
int wheelPin=A5; // аналоговый пин, на котором мы считываем сопротивление нажатой на руле кнопки
int i=0;
int prevButton=0;

int r;  //keyboard
unsigned long flag = 0;  //keyboard

void setup() {   
  
  pinMode(csPin, OUTPUT);   
  delay(50);
  SPI.begin();
  delay(50);
  
  SPI.transfer(POT); // команда
  SPI.transfer(0); // значение
  pinMode(wheelPin, INPUT);

  delay(100);
  Keyboard.begin();  //keyboard
}

int getR() { // Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0

  // читаем сопротивление (на самом деле напряжение, конечно) на аналоговом пине
  int r=analogRead(wheelPin); 
      //if(r>=release_button - button_release_range && r<=release_button + button_release_range && flag == 0) //keyboard 

  if (r>=2 && r<=10) return(next);
  if (r>=50 && r<=60) return(previous);
  if (r>=120 && r<=156) return(vol_up);
}

// ОСНОВНОЙ ЦИКЛ
void loop() {
  int currButton=getR(); // заносим в переменную currButton код нажатой кнопки
  if (currButton!=prevButton) { // если значение поменялось с прошлого раза

    delay(10);
    currButton=getR(); // ждем 10ms и читаем еще раз, чтобы исключить "дребезг" кнопки

    if (currButton!=prevButton) { // если код кнопки точно поменялся с прошлого раза
      //Serial.println(currButton);
      prevButton=currButton;     // сохраняем новое значение в переменную prevButton

      // Выставляем сопротивление на потенциометре, тем самым посылаем команду на магнитолу.
      // Значения сопротивлений даны для Pioneer, для магнитол других марок числа будут другие.
      SPI.transfer(0); 
      switch(currButton) {
       case next: digitalWrite(csPin, LOW);
                    SPI.transfer(POT); 
                    SPI.transfer(21); 
                    digitalWrite(csPin, HIGH);
                 
                      Remote.next();  
                      flag = 0;  
                      delay(10); 
                      Remote.clear(); 
                      break;  // 16k
      
     case previous: digitalWrite(csPin, LOW);
                    SPI.transfer(POT); 
                    SPI.transfer(50); 
                    digitalWrite(csPin, HIGH);
                     
                      Remote.previous();  
                      flag = 0;  
                      delay(10);  
                      Remote.clear();  
                     break;  // 24k
                    
                    
       case vol_up: digitalWrite(csPin, LOW);
                     SPI.transfer(POT); 
                     SPI.transfer(14); 
                     digitalWrite(csPin, HIGH);
                     break;  // 11k
                    
       default:      digitalWrite(csPin, LOW);
                     SPI.transfer(POT);
                     SPI.transfer(0);
                     digitalWrite(csPin, HIGH);
                     break;
          
     }
   }
  }
    delay(5);
}

Последний раз редактировалось Chois; 10.09.2017 в 14:47.
Chois вне форума   Ответить с цитированием
Старый 09.09.2017, 01:25   #773
Rover
Старший Пользователь
 
Аватар для Rover
 
Регистрация: 14.11.2009
Город: г. Жуковский
Регион: 50, 90, 150
Сообщений: 271
Rover is a jewel in the roughRover is a jewel in the roughRover is a jewel in the rough
По умолчанию

Цитата:
Сообщение от lti1 Посмотреть сообщение
Соберу всю информацию по одному из решений в одном месте, у кого есть возможность закрепите ссылку в первом сообщении.
Работает только с Arduino Pro Micro и Arduino Leonardo на чипе ATmega32u4.
Для начала меняем в папке \arduino-1.0.5\hardware\arduino\cores\arduino для IDE 1.0.5 или \arduino-1.6.5-r5\hardware\arduino\avr\cores\arduino для IDE 1.6.5 меняете два файла USBAPI.h, HID.cpp на те, что во вложении этого сообщения, при этом версия ПО Arduino Software IDE должна быть 1.0.5, скачать setup exe, скачать zip ИЛИ 1.6.5, на других не проверял.
После заливаете этот скетч и считайте коды всех кнопок через "монитор порта" Arduino Software (IDE).
PHP код:
int analogPin=0//пин для подключения кнопок
int data;

void setup()
{
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Serial.begin(9600);
}

void loop()
{
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data);
delay(1000);

Подключаете кнопки к Arduino по следующим схемам, с подтяжкой к - или к +. Номинал сопротивления ~20 кОм.
Вложение 38555
Потом заливаете этот скетч, только в начале скетча указываете свои значения, то есть вместо 111, 222, 333, 444, 555, 777 указываете значения своих кнопок, а также значение при отпущенных кнопках, в зависимости от схемы подключения будут либо ближе 0 либо ближе к 1023:
PHP код:
//****************** Здесь необходимо указать свои значения *************** 

int analogPin=0// пин для подключения кнопок, по умолчанию A0 

int release_button 1023// значение при отпущенных кнопках 
int button_release_range 50// диапазон значения + - при отпущенных кнопках 
int button_range 5// диапазон значения нажатых кнопок + - 
int time_holding 500// время для удержания кнопок в миллисекундах 
int time_tinkling 30// время исключающее дребезг контактов в миллисекундах 
int vol_up 111// значение кнопки увеличить громкость 
int vol_down 222// значение кнопки уменьшить громкость 
int alt_tab 333// значение кнопки которая будет работать как Alt + Tab 
int next 444// значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании 
int previous 555// значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании 
int play_pause 777// значение кнопки которая будет работать как Play/Pause при коротком нажатии и Mute при удержании 

//************************************************************************** 

int data;  
unsigned long flag 0;  
unsigned long eventTime 0;  
unsigned long pauseMillis 0

void setup()  

analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение) 
Keyboard.begin();  
}  

void loop()  
{  
data=analogRead(analogPin);  
if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 0)  
{  
eventTime=millis();  
}  

//********************** Громкость ************************************ 

if(millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= vol_up button_range && data <= vol_up button_range && flag == 0
{   
Remote.increase();  
flag 5;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= vol_up button_range && data <= vol_up button_range && flag == || data >= vol_up button_range && data <= vol_up button_range && flag && flag == 3)  
{   
Remote.increase(); 
flag 3;  
Remote.clear();  
delay(100);  
}  

if(
millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= vol_down button_range && data <= vol_down button_range && flag == 0)  
{   
Remote.decrease();  
flag 6;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= vol_down button_range && data <= vol_down button_range && flag == || data >= vol_down button_range && data <= vol_down button_range && flag == 3)  
{   
Remote.decrease();  
flag 3;  
Remote.clear();  
delay(100);  
}  

//********************** AltTab + Ещё что то ************************************   

if(millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= alt_tab button_range && data <= alt_tab button_range)  
{   
flag 1;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == && pauseMillis == 0)  
{  
Keyboard.press(KEY_LEFT_ALT);  
Keyboard.press(KEY_TAB);  
Keyboard.release(KEY_TAB);  
Keyboard.press(KEY_TAB);  
Keyboard.release(KEY_TAB);  
flag 0;  
pauseMillis millis();  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == && pauseMillis != 0)  
{  
Keyboard.press(KEY_TAB);  
Keyboard.release(KEY_TAB);  
flag 0;  
pauseMillis millis();  
}  

if(
pauseMillis && millis()-pauseMillis >= 800 && data>=release_button button_release_range && data<=release_button button_release_range)  
{  
flag 0;  
pauseMillis 0;  
Keyboard.releaseAll();  
}  

if(
millis()-eventTime>time_holding && data >= alt_tab button_range && data <= alt_tab button_range && flag == 1)  
{   
flag 0;  
}  
//********************** Next и Fast Forward ************************************   

if(millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= next button_range && data <= next button_range)  
{   
flag 2;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 2)  
{  
Remote.next();  
flag 0;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= next button_range && data <= next button_range && flag == || data >= next button_range && data <= next button_range && flag == 3)  
{   
Remote.forward();  
flag 3;  
Remote.clear();  
delay(100);  
}  
//********************** Previous и Rewind ************************************   

if(millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= previous button_range && data <= previous button_range)  
{   
flag 4;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 4)  
{  
Remote.previous();  
flag 0;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= previous button_range && data <= previous button_range && flag == || data >= previous button_range && data <= previous button_range && flag == 3)  
{   
Remote.rewind(); 
flag 3;  
Remote.clear();  
delay(100);  
}  

//********************** Play/pause + Mute ************************************   

if(millis()-eventTime<time_tinkling && millis()-eventTime<time_holding-&& data >= play_pause button_range && data <= play_pause button_range)  
{   
flag 7;  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == 7)  
{  
Remote.play_pause();   
flag 0;  
delay(10);  
Remote.clear();  
}  

if(
millis()-eventTime>time_holding && data >= play_pause button_range && data <= play_pause button_range && flag == 7)  
{   
Remote.mute(); 
flag 0
delay(10); 
Remote.clear();  
}  

if(
data>=release_button button_release_range && data<=release_button button_release_range && flag == || data>=release_button button_release_range && data<=release_button button_release_range && flag == || data>=release_button button_release_range && data<=release_button button_release_range && flag == 6)  
{  
flag 0;  
}   

Алгоритм работы такой: короткое нажатие, более 10 (int time_tinkling = 10; можно менять в скетче) и менее 500 миллисекунд (int time_holding = 500; можно менять в скетче) - Play/pause; длинное, более 500 миллисекунд (int time_holding = 500; можно менять в скетче) - Mute.
Тоже самое с Next и Fast Forward, Previous и Rewind. При удержании увеличения и уменьшения громкости, увеличивает или уменьшает громкость на 10 делений в секунду, а при коротком нажатии, менее 500 миллисекунд - увеличивает или уменьшает громкость на 1 деление.
Alt + Tab, при первом нажатии эмулирует Alt и два раза Tab, то есть переходит предыдущему открытому приложении и в течении 0,8 секунды удерживает Alt, а повторные нажатия на кнопку в течении этого времени эмулируют только Tab. На удержание ни чего не назначен, можно добавить при необходимости.



У меня возникла проблемма, может кто сталкивался.
Скетч этот, ардуина про микро. Всё прекрасно шьётся и работает под Андроидом, Виндой, но вот под WIN 10 странный трабл - если ардуина сидит в USB порту (не важно, ХАБ или на матери), то после перезагрузки или включения компа она как ХИД устройство не реагирует на нажатие клавиш, надо переткнуть, тогда всё норм. Причём СОМ порт виден без всяких траблов. Повторю, это только под десяткой, под семёркой или андроидом всё норм.
Что это может быть?
Как бороться?- электрически перезагружать USB не очень кошерно.
Может быть внедрить функцию "reset" в данный скетч? Например при длительном нажатии AltTab сделать перзагрузку ардуины?
Как это прописать в скетче?
Rover вне форума   Ответить с цитированием
Старый 09.09.2017, 11:07   #774
lti1
Старший Пользователь
 
Аватар для lti1
 
Регистрация: 17.01.2010
Возраст: 48
Город: Самара
Регион: 63, 163
Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶
Сообщений: 457
lti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Rover Посмотреть сообщение
У меня возникла проблемма, может кто сталкивался.
Скетч этот, ардуина про микро. Всё прекрасно шьётся и работает под Андроидом, Виндой, но вот под WIN 10 странный трабл - если ардуина сидит в USB порту (не важно, ХАБ или на матери), то после перезагрузки или включения компа она как ХИД устройство не реагирует на нажатие клавиш, надо переткнуть, тогда всё норм. Причём СОМ порт виден без всяких траблов. Повторю, это только под десяткой, под семёркой или андроидом всё норм.
Что это может быть?
Как бороться?- электрически перезагружать USB не очень кошерно.
Может быть внедрить функцию "reset" в данный скетч? Например при длительном нажатии AltTab сделать перзагрузку ардуины?
Как это прописать в скетче?
В таком случае правильнее задействовать вывод VBUS, то есть подавать на него логическую единицу после загрузки винды.
После выключения компа USB порт обесточивается? Можно попробовать добавить задержку после подачи питания на ардуино, в setup().
PHP код:
void setup()  
{
delay(30000); // задержка 30 секунд
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение) 
Keyboard.begin();  

Миниатюры
Нажмите на изображение для увеличения
Название: IMG_2706.jpg
Просмотров: 626
Размер:	52.5 Кб
ID:	48103  
lti1 вне форума   Ответить с цитированием
Старый 09.09.2017, 13:45   #775
Rover
Старший Пользователь
 
Аватар для Rover
 
Регистрация: 14.11.2009
Город: г. Жуковский
Регион: 50, 90, 150
Сообщений: 271
Rover is a jewel in the roughRover is a jewel in the roughRover is a jewel in the rough
По умолчанию

Цитата:
Сообщение от lti1 Посмотреть сообщение
В таком случае правильнее задействовать вывод VBUS, то есть подавать на него логическую единицу после загрузки винды.
После выключения компа USB порт обесточивается? Можно попробовать добавить задержку после подачи питания на ардуино, в setup().
PHP код:
void setup()  
{
delay(30000); // задержка 30 секунд
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение) 
Keyboard.begin();  

Увы, это не помогло
Загрузка с нуля - не реагирует на нажатие как ХИД. Передёрнул (в хорошем смысле ) через 30 секунд начинает реагировать.
На двух машинах так -на одной WIN10 64 на другой WIN10 32, совершенно разные аппараты, так что дело не в железе.
Rover вне форума   Ответить с цитированием
Старый 09.09.2017, 20:08   #776
lti1
Старший Пользователь
 
Аватар для lti1
 
Регистрация: 17.01.2010
Возраст: 48
Город: Самара
Регион: 63, 163
Машина: Skoda Octavia A5 FL && Skoda Octavia Tour && ̶F̶F̶3̶
Сообщений: 457
lti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond reputelti1 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Rover Посмотреть сообщение
Увы, это не помогло
Загрузка с нуля - не реагирует на нажатие как ХИД. Передёрнул (в хорошем смысле ) через 30 секунд начинает реагировать.
На двух машинах так -на одной WIN10 64 на другой WIN10 32, совершенно разные аппараты, так что дело не в железе.
До Vbus на китайской pro micro не добраться, под чипом разводка, я проверил.
Тогда пробуйте первый способ описанный здесь, второй, программный способ не заработал у меня на pro micro.
lti1 вне форума   Ответить с цитированием
Старый 10.09.2017, 17:50   #777
Rover
Старший Пользователь
 
Аватар для Rover
 
Регистрация: 14.11.2009
Город: г. Жуковский
Регион: 50, 90, 150
Сообщений: 271
Rover is a jewel in the roughRover is a jewel in the roughRover is a jewel in the rough
По умолчанию

Цитата:
Сообщение от lti1 Посмотреть сообщение
До Vbus на китайской pro micro не добраться, под чипом разводка, я проверил.
Тогда пробуйте первый способ описанный здесь, второй, программный способ не заработал у меня на pro micro.
И у меня не заработал

А как скетч поправить, чтобы при длительном нажатии кнопки, эмулирующем AltTab вызвать RESET ардуины?
Rover вне форума   Ответить с цитированием
Старый 10.09.2017, 18:40   #778
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Rover Посмотреть сообщение
И у меня не заработал

А как скетч поправить, чтобы при длительном нажатии кнопки, эмулирующем AltTab вызвать RESET ардуины?
а если ватчдогом попробовать воспользоваться? Выставить ватчдог на 250-500 мс, сообытие - делай(1000) - ресет. Только стандартный загрузчик не поддерживает его вроде.
oleg707 вне форума   Ответить с цитированием
Старый 10.09.2017, 20:20   #779
Rover
Старший Пользователь
 
Аватар для Rover
 
Регистрация: 14.11.2009
Город: г. Жуковский
Регион: 50, 90, 150
Сообщений: 271
Rover is a jewel in the roughRover is a jewel in the roughRover is a jewel in the rough
По умолчанию

Цитата:
Сообщение от oleg707 Посмотреть сообщение
а если ватчдогом попробовать воспользоваться? Выставить ватчдог на 250-500 мс, сообытие - делай(1000) - ресет. Только стандартный загрузчик не поддерживает его вроде.
Вот какая ещё фигня - ватчдог не получит сигнал тревоги, ардуина определяется вполне корректно, единственное - не даёт компу коды HID устройства. Почему это происходит, я не понимаю.

Мониторинг СОМ порта тоже работает всегда и без проблем.
Поэтому на данный момент мне проще кнопкой на руле (длительное нажатие) перезагрузить ардуину.
В написании скетчей не силён, вот и стуканул о помощи.
Rover вне форума   Ответить с цитированием
Старый 10.09.2017, 20:32   #780
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от Rover Посмотреть сообщение
Вот какая ещё фигня - ватчдог не получит сигнал тревоги, ардуина определяется вполне корректно, единственное - не даёт компу коды HID устройства. Почему это происходит, я не понимаю.

Мониторинг СОМ порта тоже работает всегда и без проблем.
Поэтому на данный момент мне проще кнопкой на руле (длительное нажатие) перезагрузить ардуину.
В написании скетчей не силён, вот и стуканул о помощи.
если ты сделаешь команду delay(10000); то ватчдог вроде должен сработать. Уже не помню свои опыты.
https://geektimes.ru/post/255800/
oleg707 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 02:51.


Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot