Ответ на пост «В Нью-Йорке начали бороться против прямотоков»
Навеяло. Живу у дороги и накопил некоторую статистику, которая выражена в этом импровизированном меме
95% шумных гонщиков ездят на хламе, по цене среднего велика. Хорошие же машины обычно шумят больше за счёт шиповки, а не выхлопа.
Как по мне, в городах нужно жить так, чтобы не мешать другим людям.
В Нью-Йорке начали бороться против прямотоков
Сначала они подняли штраф с 150 до 1000$ штраф за несоблюдение норм, сейчас в тестовом режиме заработали автоматические камеры с измерителем шума. Пока они выдают предупреждение. Следующий штраф будет 875$ (66 тыс руб)
Загуглил, вилка штрафов там довольно большая: согласно закону владельцы могут быть наказаны штрафом в размере от 150 до 525 долл. за первое нарушение; от 300 до 1050 долл. за второе правонарушение; и от 450 до 1575 долларов за любое нарушение после этого. Полагаю зависит именно от громкости звука - если пердит чуть-чуть, то небольшой штраф, а если как следует - то влепят по полной.
Уточнение от @polycarp72 #comment_227093159
Штраф не за повторное нарушение, а за неявку на измерение шума. Товарищу, которого засекли на камере с измерителем шума, было предложено приехать измерить шум и, если шум превышает норму, ему дадут время на замену глушака. Он забил на эту возможность и предложение превратилось в требование, за игнорирование которого - штраф. Это обычная практика в штатах, когда дается время на устранение незаконных модов у машин. Меня в свое время в Кали стопанули за тонировку. Тут нельзя тонировать стекла на передних дверях вообще, а я только переехал из штата, где было разрешено и тонировка была уже на новой машине. Отодрал пленку с передних дверей, заехал в ментовку, мне подписали бумажку и отменили штраф.
Продолжение поста «Имплантация bluetooth платы в магнитолу pioneer mvh-190ub и адаптер кнопок руля в одном флаконе»
Еще раз напоминаю, все это тут в образовательных и развлекательных целях и повторение на ваш страх и риск. Все что сделаете своими ручками будет на вашей совести.
Предыстория этого безобразия тут. Откуда брать питание, куда подключать адаптер кнопок управления и аудиосигнал можно посмотреть там.
В сухом остатке от моей идеи теперь есть вот это:
Вот схема этого безобразия:
Если кому нужен только адаптер кнопок руля - просто берем нижнюю половину схемы и убираем нижний цифровой резистор X9C104 и резюк на10 кОм (так же убираем его если платка без кнопок или вообще другой модели).
Если кому нужно просто включать блютус платку в режиме AUX (в наличии второго такого умалишенного я сомневаюсь), то верхняя половина схемы, ну и управлением платкой можно пренебречь.
Номинал резистора 680 Ом выбран таковым в силу малости сопротивления резисторов кнопок на руле (от 30 до 1150 Ом), дабы обеспечить максимальное изменение напряжение на входе микросхемы. То есть его значение может быть и выше, в зависимости от вашего случая. Ниже точно нет - можно спалить вход на ардуине.
Резистор в 10 кОм создает делитель напряжения совместно с цифровым резистором и ограничивает ток на ножке микросхемы. Там по схеме с китайского сайта должно быть 22 кОм, но 10 тоже работают.
Если что, то я использовал esp-12f из-за малых размеров. Но исходно тестировал на большой платке. Просто начинающие не разберутся с прошивкой и обвесом, а те кто в теме и без меня поймут че и как. По факту все это можно собрать на стандартных блоках с помощью стандартных соединительных проводов, разве что зафиксировать от выпадания.
Код снова положу здесь, не хочу в гитхаб тащить - засмеют.
И снова привет команде пикабу за ущербный редактор, табы то зачем жрать?!
// Коды имеющихся на руле кнопок
const int VOL_UP=1;
const int VOL_DN=2;
const int PREV_TR=3;
const int NEXT_TR=4;
const int MODE=5;
const int MUTE=6;
// контакты первого потенциометра
int INC = 7;
int UD = 6;
int CS=5;
// аналоговый пин, на котором мы считываем сопротивление нажатой на руле кнопки
int wheelPin=A6;
// контакты второго потенциометра
int INC1 = 2;
int UD1 = 3;
int CS1=4;
// переменные
//int i=0;
int prevButton=7; // на всякий случай, чтобы при подаче питания сработал цикл и потенциометры были инициализированы
int j = 100; // инициируем переменную для первого потенциометра управляющего магнитолой
int k = 100; // для второго управляющего блютус платкой
void setup() {
pinMode(CS, OUTPUT);
pinMode(INC, OUTPUT);
pinMode(UD, OUTPUT);
digitalWrite(CS, HIGH);
digitalWrite(INC, HIGH);
digitalWrite(UD, HIGH);
pinMode(wheelPin, INPUT);
Serial.begin(115200);
pinMode(CS1, OUTPUT);
pinMode(INC1, OUTPUT);
pinMode(UD1, OUTPUT);
digitalWrite(CS1, HIGH);
digitalWrite(INC1, HIGH);
digitalWrite(UD1, HIGH);
}
// Эта функция читает сопротивление с кнопок на руле и возвращает код нажатой кнопки, либо 0
int getR() {
// читаем сопротивление (на самом деле напряжение, конечно) на аналоговом пине
int r=analogRead(wheelPin);
Serial.println(r); // для отладки
delay(100); // не знаю зачем
// Ищем, какая кнопка соответствует этому сопротивлению.
// Данные значения сопротивлений
if (r>=95 && r<=180) return(VOL_UP);//130 значение r для моей машины
if (r>=190 && r<=270) return(VOL_DN);//230
if (r>=550 && r<=750) return(PREV_TR);//605
if (r>=400 && r<=530) return(NEXT_TR);//476
if (r>=250 && r<=390) return(MODE);//333
if (r>=10 && r<=90) return(MUTE);//30
// если ни одна из кнопок не нажата, возвращаем 0
return (0);
}
// ОСНОВНОЙ ЦИКЛ
void loop() {
int currButton=getR(); // заносим в переменную currButton код нажатой кнопки
// Serial.println(currButton);
// Serial.println(prevButton);
if (currButton!=prevButton) { // если значение поменялось с прошлого раза
delay(10);
currButton=getR(); // ждем 10ms и читаем еще раз, чтобы исключить "дребезг" кнопки
if (currButton!=prevButton) { // если код кнопки точно поменялся с прошлого раза
prevButton=currButton; // сохраняем новое значение в переменную prevButton
switch(currButton) {
case VOL_UP: j = 15; break; //справка для значения сопротивлений pineer 16kОм (97 Ом для моей машины)
case VOL_DN: j = 23; break; //24к (201)
case PREV_TR: j = 11; k=64; setResistance1(k); break; //11к (1153)
case NEXT_TR: j = 7; k=74; setResistance1(k); break; //8к (611)
case MODE: j = 1; break; //1,2к (344)
case MUTE: j = 3; break; //4к (31)
default: j = 100; k = 100; setResistance1(k); break;// вертаем максимальное сопротивление
// точные значения j и k подбираются опытным путем, исходя из параметров цифровых резисторов
// у первого контролируется сопротивление, у второго падение напряжения на выходе
}
// выставляем сопротивление
setResistance(j);
// setResistance1(k); // заколходил вызов функции прям в свиче, чтобы лишний раз не гонять функцию, которая выполняется совсем не мгновенно
// Serial.print("j ");
// Serial.println(j); // да да, я не знаю как нормально отладкой заниматься на ардуине, используем дедовский способ.
// Serial.print("k ");
// Serial.println(k);
delay(50); // добавил паузу, чтобы четче отрабатывался сигнал магнитолой
}
}
}
// Эта функция задает сопротивление на цифровом резисторе 1
void setResistance(int percent) {
Serial.println(percent);
// Понижаем сопротивление до 0%:
digitalWrite(UD, LOW);
digitalWrite(CS, LOW);
for (int i=0; i<100; i++) {
digitalWrite(INC, LOW);
delayMicroseconds(1);
digitalWrite(INC, HIGH);
delayMicroseconds(1);
}
// сопротивление до нужного:
digitalWrite(UD, HIGH);
for (int i=0; i<percent; i++) {
digitalWrite(INC, LOW);
delayMicroseconds(1);
digitalWrite(INC, HIGH);
delayMicroseconds(1);
}
digitalWrite(CS, HIGH);
}
// Эта функция задает сопротивление на цифровом резисторе 2
void setResistance1(int percent) {
// Понижаем сопротивление до 0%:
digitalWrite(UD1, LOW);
digitalWrite(CS1, LOW);
for (int i=0; i<100; i++) {
digitalWrite(INC1, LOW);
delayMicroseconds(1);
digitalWrite(INC1, HIGH);
delayMicroseconds(1);
}
// сопротивление до нужного:
digitalWrite(UD1, HIGH);
for (int i=0; i<percent; i++) {
digitalWrite(INC1, LOW);
delayMicroseconds(1);
digitalWrite(INC1, HIGH);
delayMicroseconds(1);
}
digitalWrite(CS1, HIGH);
}
Второй скетч также был безжалостно сперт. На этот раз из стандартного примера библиотеки spi slave для esp8266. Откусил от примера кусочек, заставил читать статус SPI сообщения и как ни странно в этих данных обнаружил искомые сигналы на которые и заставил реагировать микросхемку.
/*
SPI Slave Demo Sketch
Connect the SPI Master device to the following pins on the esp8266:
GPIO NodeMCU Name | Uno
===================================
15 D8 SS | D10
13 D7 MOSI | D11
12 D6 MISO | D12
14 D5 SCK | D13
Note: If the ESP is booting at a moment when the SPI Master has the Select line HIGH (deselected)
the ESP8266 WILL FAIL to boot!
See SPISlave_SafeMaster example for possible workaround
*/
#include "SPISlave.h"
const int SwitchBT = 4;
int SwitchBTState;
void setup()
{
Serial.begin(115200);
Serial.setDebugOutput(true);
pinMode(SwitchBT, OUTPUT);
// data has been received from the master. Beware that len is always 32
// and the buffer is autofilled with zeroes if data is less than 32 bytes long
// It's up to the user to implement protocol for handling data length
SPISlave.onData([](uint8_t * data, size_t len) {
// Serial.printf("D%s\n", (int*)data);
// uint32_t istatus = SPIIR;
// uint32_t iiistatus = SPI1S;
// Serial.println(SPIIR, BIN);
// Serial.println(SPI1S, BIN);
// Serial.println(SPII1, BIN);
});
// status has been received from the master.
// The status register is a special register that bot the slave and the master can write to and read from.
// Can be used to exchange small data or status information
SPISlave.onStatus([](uint32_t data) {
Serial.printf("S%u\n", data);
if (data == 2248212531) {
SwitchBTState = HIGH;
Serial.println("high");
}
if (data == 2214658099 || data == 2147549235 || data == 2214658227) {
SwitchBTState = LOW;
Serial.println("low");
}
});
// Setup SPI Slave registers and pins
SPISlave.begin();
}
void loop() {
digitalWrite(SwitchBT, SwitchBTState);
}
Если что, вот какая прорва информации была перелопачена в поисках заветных сочетаний циферок:
Подключать к магнитоле надо вот к этим ножкам:
На самой плате удобнее припаяться к тестовым пятакам снизу. Какой провод за что отвечает на фото уже не вспомню. Да и если вы надумали повторить это и не знаете как прозвонить контакт - то вам явно не стоит лезть в это.
Подводя итог - шалость удалась ©
Я получил массу эмоций, чуточку знаний и море удовольствия в эти огразмические секунды бега по квартире с криками "IT'S ALIVE !1!11!", когда эта хрень заработала. Конечно, есть шероховатости типа негромкого щелчка в колонках при подаче питания на платку. Но городить ерунду с еще одним сигналом на мьют усилителя счел излишним. Тогда уже проще купить магнитолу и не сношать мозг.
Впрочем... собрать "свою" магнитолу идея в голове присутствует. Даже для пробы купил ЦАП крошечный с алика для мобилки и компьютера... а надо сказать очень крутая штука оказалось! Я как джаз послушал... так восторг, джаз прям заиграл. Но об этом может быть потом.
Ах да, самое главное. Мораль =)
Мораль такова - разделяй отладку железа и софта. Сначала одно, потом другое. Ну и внимательней с редактированием кода, одна маленькая ошибочно закомментированная строчка может стоить вам многих часов попаболи и искреннего непонимания почему оно не работает. Ну и +-20% отклонения это овердохера.
Но самое главное - не работайте уставшим над сложными или важными вещами, это чревато большими потерями времени и нервов, в лучшем случае.
А вот теперь я хочу рассказать о тех душевных терзаниях и страданиях которые испытал на этом тернистом пути. К прочтению совсем не обязательно, не гарантирую что вам это будет интересно.
Сама соль проблемы в том, что главные ардуинщики и библиотекописаки идиоты. Они решили что анрдуине не нужны микроконтроллеры в режиме slave. Хотя в процессе поиска решения своей проблемы сталкивался с огромным количеством случаев когда люди хотели получить такую плюшку. Смысл же ардуины в том, чтобы облегчить жизнь и дать в руки инструмент относительно простой и не требующий взрывать мозг хардкорным прогерством на сишке или плюсах. Если посмотреть код и прудыдущего поста, то окажется что в нем ардуина моя работает с spi в slave режиме напрямую, то есть минуя разные там библиотеки и просто обращаясь к регистрам. Забегая вперед скажу что вроде как единственная работающая библиотека умеющая в slave есть только у esp8266, а esp32 и STM32 уже не имеют такой. Собственно, на ней и основано решение проблемы.
Итак, столкнувшись с тем, что ардуино нано не успевает решил попробовать esp8266. Вот тут еще кусочек морали - никогда не спеши с выводами. С ходу использовав тестовый скетч я не получил удобоваримой информации и мало того, получал её в виде кроказябр. Психанув закинул на дальнюю полку и заказал stm32f103c6t6 - младшенькую из bluepill семейства. Кстати, у меня теперь этого добра кучка тыщь на пять и я не знаю что с ним делать =) вот такой вот побочный эффект от "экономии". Придется придумывать проект где можно задействовать все это барахло.
Ну продолжим. Естественно, я не изучил информацию досконально и наступил на те же грабли - нет нужной библиотеки а код для ардуино нано естественно не подходит. И тут меня торкнуло, я попробовал откусить кусок больше, чем мог проглотить. С одной стороны я хотел закончить проект во чтобы то ни стало, а с другой сил и терпения на него было не много. Ах да, началось все с того, что все пять присланных эстээмок не работали через USB, то есть прошить их не получалось. Благо я умел делать это используя USB конвертер с ардуины, но легче от этого не стало, чего-то там все равно не хватало и нужен был родной программатор, который я естественно проигнорировал. Но в целом обошлось, ардуина умеет делать .bin который и прошивался через последовательны интерфейс. Но и тут меня ждало разочарование, требовалось таки прильнуть к корням. Вот щас страшные картинки накидаю.
Собственно, с STM32CubeIDE и STM32CubeMX я познакомился в попытках решить проблему определения контроллера USB портом. И надо сказать, это очень крутые штуки. Мало того, что относительно легко можно скофигурировать назначение ног контроллера натыркав правильные галки, так еще оно и код минимальный под это генерирует само. Но вот на этом моменте я и сломался окончательно. Я научился читать данные из шины spi... Но снова в кракозябрах... и буфер... и... В общем, я решил что разбираться в библиотеке HAL и сишном синтаксисе дальшке яне готов. Я же только учусь на джаве пописывать, а тут сишка. Я хз как, но джава все равно мягче и приятнее для пониманию. А СИ это как... ну я хз... ну как носить чугунные сапоги против удобных кросовочек. Если научишься в них ходить и недабох бегать - тебя просто не остановить, как халк будешь сносить все подряд. Правда бесшумно ходить тоже не сможешь :)
Короче, решил я уменьшить градус накала и внимательней присмотреться к espшке... И о чудо, буквально в один вечер поковыряв код высрал франкеншейна, который заработал.
Автозвук
Выставка тюнинга и автозвука
Вчера на пляже Карон была организована небольшая выставка машин с экстремальным автозвуком
Проблема с электрикой автомобиля
Добрый день.
Возникла проблема с электрикой автомобиля kia rio (jb /fl) 2010 года выпуска. (Седан)
1. Пропало освещение багажного отделения и при открытии багажника нет горения датчика открытия на приборной доске.
2 . Через несколько дней после появления первой проблемы перестали работать колонки, как передние, так и задние.
Магнитола родная, видит флешку, радиостанции, но звука нет.
Пытался перевести звук вперёд/назад, влево/вправо - бесполезно. Правда, как возможный симптом, накануне, перед исчезновением звука, флешка "играла" не так, как обычно, тормозила, звук кратковременно прерывался.
Планирую в сервис, но хотелось бы примерно представлять причину, возможный объём работ.
Заранее благодарю всех ответивших по делу.