суббота, 20 июня 2020 г.

Навигация Спутник OFF-Line Orux-Maps инструкция

На каждой покатушке так или иначе встает вопрос оффлайн навигации по спутниковым картам. Как правило, в лесу нет не то, что интернета, а, банально, связи, поэтому перед тем как въехать в лес, проводник, как правило, с помощью Гугл.Карт прокачивает спутниковые снимки себе в кэш.
Этот способ навигации очень неудобен. Часто бывают моменты, когда по той или иной причине спутниковые карты не подгружаются даже из кэша. Толком не работает масштабирование. Ну и производительность всего этого добра оставляет желать лучшего. До недавнего времени меня это не особо волновало, но на днях я все-таки решил озадачиться данным вопросом.
Постановка задачи: возможность пользоваться спутниковыми снимками гугла в оффлайне.
Изучая интернет на эту тему, натыкаюсь на программу OruxMaps. Начинаю изучать возможности данной программы и понимаю, что это то, что нужно. По статьям в интернете должно все заработать так, как я хочу.
Решил попробовать разобраться с этой программой. В Play Маркете данной программы нет, поэтому идем на официальный сайт и скачиваем её к себе на смартфон.
Скачав .apk пакет, устанавливаем его. После установки запускаем приложение OruxMaps и наблюдаем вот такое окно:
Полный размер
Интерфейс у программы не особо дружелюбный, но зато возможности покрывают данный недостаток. Итак. Теперь перейдем к списку карт. Для этого в правом верхнем углу нажимаем на пиктограмму карты и видим вот такое меню:
Полный размер
Далее нажимаем "Выбор карты" и получаем вот такой список:
Полный размер
В первый раз, когда я это увидел, подумал, что за хрень, куда тыкать? На самом деле здесь все просто. Перед вами просто список доступных онлайн сервисов, с которых OruxMaps просто подгружает карты. Можете ради интереса потыкать их, может ченить интересного найдете.
Ну это то, что касается онлайн карт. Если вы перейдете на соседнюю вкладку "OFFLINE", то увидите список доступных оффлайн карт:
Полный размер
Карта "world" по сути просто карта заглушка. Теперь переходим к самому интересному, а именно, интеграции спутниковых карт гугла в OruxMaps. Чтобы это сделать, необходимо скачать вот этот файл:
Далее копируем этот файл в папку oruxmaps/mapfiles. На вопрос, перезаписать имеющийся в этой папке файл? отвечаем "Да". Далее перезаходим в программу и открываем список ONLINE карт:
Полный размер
Как видим, в списке появились карты гугла. Нажимаем на Goole Earth (ONLINE) и видим обычные спутниковые карты гугла:
Полный размер
Теперь нам необходимо на базе этих онлайн карт сделать для себя оффлан карты нужных нам областей. Для этого нажимаем на пиктограмму карты. Видим меню, в котором выбираем "Map tools":
Полный размер
А теперь жмем "Создание карты":
Полный размер
После этого появится информационное окошко с описанием последовательности действий:
Полный размер
Все, что вам нужно, так это выделить нужную область на карте. Просто тыкните пару раз по карте в разных местах, и вы быстро поймете, что к чему. Стоит особо отметить, что не следует выбирать очень большую область. У OruxMaps есть ограничения на размер за раз скачиваемой области.
Полный размер
Когда необходимая область выбрана, нажмите на синий значок "V". После этого вы увидите вот такое конфигурационное окно:
Полный размер
Здесь все достаточно просто. Вам необходимо ввести название оффлайн карты и уровень детализации. Как видно выше, я выбрал от 00 до 17. Если поставить 18, то карта будет очень большой. Чтобы обойти это ограничение, я ту же саму область закачал вот так:
Полный размер
После того, как вы проставили везде галочки и ввели название, необходимо нажать кнопку "Загрузить". Далее вы увидите окно загрузки:
Полный размер
У меня карты загружались часов по 5, поэтому я запускал данный процесс только на ночь. За один раз можно скачать только одну область. То есть, нельзя поставить на закачку сразу несколько областей.
После того, как карты загрузятся, вы их сможете увидеть в списке оффлайн карт:
Полный размер
Всё. Теперь вы можете выбрать карту и осуществлять навигацию по ней:
Полный размер
Что еще прикольно, так это то, что OruxMaps автоматически переходит между оффлайн картами, когда вы перемещаетесь из одной области в другую. То есть, можно понакачать нужных областей и потом абсолютно бесшовно по ним передвигаться.
Я уже успел попользоваться в лесу OruxMaps. Программа работает просто супер, даже как-то поначалу и не верилось, что теперь у меня спутниковые карты Хабаровска и его окрестностей есть в телефоне в режиме полного оффлайна.
И да. Совсем забыл. Чтобы включить навигацию по этим оффлайн картам, необходимо нажать на значок "Цели":
Полный размер
Найти это меню можно, нажав вот сюда:
Кто еще до сих пор перед поездкой в лес закачивает спутниковые снимки в кэш — бросьте эту затею. Используйте OruxMaps она реально работает.

воскресенье, 14 июня 2020 г.

Kia Sportage замена мильной приборки на километровую. Корректор спидометра на Arduino

Адаптер Сигнала Скорости

Транзистор kc238b, аналог (?) обычного кт315.
3 цифровой pin на ARDUINO - сигнал с датчика скорости.
4 цифровой pin на ARDUINO - выход на стрелочный спидометр.
A0 - аналоговый вход, сюда подключается потенциометр для регулировки. 3,3kOm (например) контакты слева направо GND/СИГНАЛ/+5V.
вместо Hz в прошивке км/ч .
 При 100hz показания равны 60км/ч
скетч
//******************************************************************** volatile unsigned long micros_sp = 0; volatile byte sz = 0; //счетчик обнуления volatile unsigned int sp = 0; //скорость volatile unsigned int InputHz = 0; volatile unsigned int OutputHz = 0; double popravka = 0; volatile boolean st = false; //триггер unsigned long timing; unsigned long timing2; int Vixod=4; #define PIN_POT A0 unsigned long Period; unsigned long sp2; unsigned long Skvajnost; bool Status=0; int rotat; //******************************************************************** void setup(){ Serial.begin(115200); //инициализация ком порта attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса pinMode(PIN_POT, INPUT); pinMode (Vixod, OUTPUT); } //******************************************************************** void loop(){ if (millis() - timing > 50) { timing = millis(); if (sz != 0){sz--;}else{sp = 0;}; InputHz=sp; popravka=map(analogRead(PIN_POT),0,1023,0,200)*0.01; //Period=6000; // тестовый меандр OutputHz=InputHz*popravka; Period=600000/OutputHz; sp2=600000/Period; Serial.println ((String)OutputHz+" Hz x"+(String)popravka); Serial.println ((String)sp+"km/h"); Serial.println ((String)sp2); } Skvajnost= Period/2 ; // такая скважность называется меандр if (Status==0) { if ( (micros()-timing2)>= Skvajnost) { timing2 = micros(); digitalWrite(Vixod, HIGH); Status=1; } } if (Status==1) { if ( (micros()-timing2)>= (Period-Skvajnost) ){ timing2 = micros(); digitalWrite(Vixod, LOW); Status=0; } } } //******************************************************************** void speedometr(){ //измеряем частоту на входе спидометра по прерыванию if(!st){micros_sp = micros();} else {sp = (600000/(micros() - micros_sp));} st = !st; sz = 30; }


Полная схема подключения
Подключение от датчика с подтяжкой на 5 В
Рабочая (живая схема):
Список деталей для сборки:
транзистор КС238 или КТ3102 или КТ315.
оптрон РС 817
преобразователь 5В
переменник
резисторы 2.2ком, 1ком, 10к







 Вариант 2. Корректор тахометра и спидометра. 


 A0 pin ардуино - вход от потенциометра регулятора спидометра. 
2pin ардуино - вход - сигнал тахометра от ЭБУ двигателя 
3pin ардуино - вход - сигнал от датчика скорости 
4pin ардуино - выход - на спидометр в приборку, соединять только через транзистор как по схеме выше. 
7pin ардуино - выход - на тахометр в приборку, соединять только через транзистор как по схеме выше.
скетч:
//ТАХОМЕТР volatile unsigned long micros_th1 = 0; volatile boolean sttaho = false; //триггер тахометра volatile byte sztaho = 0; //счетчик обнуления volatile unsigned int sptaho = 0; //кол-во оборотов //КОРРЕКЦИЯ ТАХОМЕТРА volatile unsigned int InputTaho = 0; volatile unsigned int OutputTaho = 0; double popravkaTaho = 1.5; //ДЛЯ двигателя 4ц приборка от 6ц - коэффициент 1.5 //СПИДОМЕТР volatile unsigned long micros_sp = 0; volatile byte sz = 0; //счетчик обнуления volatile unsigned int sp = 0; //скорость volatile boolean st = false; //триггер //КОРРЕКЦИЯ СПИДОМЕТРА volatile unsigned int InputSpeed = 0; volatile unsigned int OutputSpeed = 0; double popravka = 0; //ВРЕМЯ РАБОТЫ ОСНОВНОЙ ПРОГРАММЫ (каждые 50 миллисекунд - указано в loop) unsigned long timing; //ГЕНЕРАТОР ИМПУЛЬСОВ СПИДОМЕТРА unsigned long timing2; unsigned long Period; unsigned long Skvajnost; bool Status=0; //ГЕНЕРАТОР ИМПУЛЬСОВ ТАХОМЕТРА unsigned long timing3; unsigned long PeriodTaho; unsigned long SkvajnostTaho; bool StatusTaho=0; //ПИНЫ int OUTSPEEDPIN=4; //ПИН ВЫХОДА - НА СПИДОМЕТР int OUTTAHOPIN=7; //ПИН ВЫХОДА - НА ТАХОМЕТР #define PIN_POT A0 //ПИН СИГНАЛА ОТ ПОТЕНЦИОМЕТРА ПОПРАВКИ //******************************************************************** void setup(){ Serial.begin(115200); //инициализация ком порта attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса attachInterrupt(0, tahometr, RISING); //прерывание тахометр по фронту импульса pinMode(PIN_POT, INPUT); pinMode(OUTSPEEDPIN, OUTPUT); pinMode(OUTTAHOPIN, OUTPUT); } //******************************************************************** void loop() { if (millis() - timing > 50) { timing = millis(); //Считаем спидометр: if (sz != 0) { sz--; } else { sp = 0; } InputSpeed=sp; popravka=map(analogRead(PIN_POT),0,1023,0,200)*0.01; //Коэффициент умножения входящего сигнала от 0.00 до 2.00. OutputSpeed=InputSpeed*popravka; //Вычисление правильной скорости Period=600000/OutputSpeed; //Вычисление периода импульса //Считаем тахометр if (sztaho != 0) { sztaho--; } else { sptaho = 0; } InputTaho=sptaho; OutputTaho=InputTaho*popravkaTaho; //Вычисление правильной скорости PeriodTaho=600000/OutputTaho; //Вычисление периода импульса } //Генерируем импульсы для СПИДОМЕТРА Skvajnost= Period/2 ; //такая скважность называется меандр if (Status==0) { if ( (micros()-timing2)>= Skvajnost) { timing2 = micros(); digitalWrite(OUTSPEEDPIN, HIGH); Status=1; } } if (Status==1) { if ( (micros()-timing2)>= (Period-Skvajnost) ){ timing2 = micros(); digitalWrite(OUTSPEEDPIN, LOW); Status=0; } } //Генерируем импульсы для ТАХОМЕТРА SkvajnostTaho=PeriodTaho/2 ; if (StatusTaho==0) { if ( (micros()-timing3)>= SkvajnostTaho) { timing3 = micros(); digitalWrite(OUTTAHOPIN, HIGH); StatusTaho=1; } } if (StatusTaho==1) { if ( (micros()-timing3)>= (PeriodTaho-SkvajnostTaho) ){ timing3 = micros(); digitalWrite(OUTTAHOPIN, LOW); StatusTaho=0; } } } //******************************************************************** void speedometr(){ //измеряем частоту на входе спидометра по прерыванию if(!st){micros_sp = micros();} else {sp = (600000/(micros() - micros_sp));} st = !st; sz = 30; } void tahometr(){ //измеряем частоту на входе тахометра по прерыванию if(!sttaho){micros_th1 = micros();} else {sptaho = (600000/(micros() - micros_th1));} sttaho = !sttaho; sztaho = 30; }
ет