Индивидуальные средства управления для электрокресла.

Автор NikolayS, 22 Фев. 2019 в 20:56

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

NikolayS

Попросили меня помочь человеку, почти полностью парализованному (пальцы немного двигаются) - сделать ну очень "легкий" джойстик для электрокресла. Вообще такие бывают штатные, приезжает к вам инжиненер из Европы, все настраивает. обходится тысяч в 200. А тут кресло БУ, да итальянское, да ввезенное из Финляндии. Жизнь она такая - иногда приходится крутится... Ни инженера ни 200кр)) Есть только я и ардуино нано))

И стали мы думать - а как вообще это должно быть по хорошему. И пришли к такому результату, пока. Родной джойстик становится "родительским" и остается "приоритетным", т е любое его отклонение блокирует второй облегченный джойстик. Устанавливается он на спинку кресла. При запуске активен именно родительский.

Облегченный джойстик... За "бесплатно"... Как-то сделали для PS3 4pins джойстики на "холлах", типа вечные, без элементов трения (переменных резисторов)- магнитики поворачиваются. И на али они рублей по 250 (https://www.aliexpress.com/item/2pcs-OEM-Original-3D-joystick-analog-Thumb-stick-3-4Pin-for-Sony-Dualshock-4-3-2/32946388207.html?spm=2114.search0204.3.2.b9b845a4epHfkg&ws_ab_test=searchweb0_0,searchweb201602_8_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910,searchweb201603_51,ppcSwitch_0&algo_expid=dee2c7b7-d905-49bc-98c4-e7806a2a5f3f-0&algo_pvid=dee2c7b7-d905-49bc-98c4-e7806a2a5f3f).
Хорошая весчь! Если у него подрезать (укоротить) пружинку, то усилие страгивания можно опустить до нуля. Ну нам надо чтобы грипса не падала. Сделано - ума здесь не нужно - пару сломать и наловчиться)) Легче не бывает - иначе грипса упадет под собственным весом.
Сложность здесь в электронике. У него два выхода на ось и выход -  +-50мВ. Это очень мало. Два выхода как я понял - типа для компенсации температурного дрейфа (сам не понял). Поэтому если вы это понимаете - можно выводы сложить (предварительно инвертировав один операционным усилителем ОУ), а можно просто использовать один увеличив вывод опять же ОУ. Вот тут есть пример, человек сначала сложил - потом увеличил.
https://www.youtube.com/watch?v=yOEgPfLNs0w
У нас две оси - нужно два ОУ. Нет ничего популярнее, наверно каждая вторая микросхема с 8 ножками - двойной ОУ. Особо качественный нам не нужен. Любой сойдет. Ну LM358 как пример двойного. А если вы уперлись то lm324 - четверной, для всех выходов. По сути это вопрос места около джойстика и вашего усердия в достижении идеала. ОУ надо размещать максимально близко от джойстика (под ним - к примеру) - он усиливает настолько маленькое напряжение, что уже возникает проблема наводок от той же 220в сети. Ну не тянуть же экранированные провода, в самом деле...
ОУ усиливает значение входящего напряжения в количество раз заданное отношением двух резисторов я взял 270кОм (обратная связь) и 10кОм (на вход) и получил 28раз. Т е 50*28=1400мВ. Или от 1.1В до 3.9В. Больше делать не надо поскольку я использовал простенький ОУ - в нижнюю сторону он может еще "работать" а вот к 5В - мертвая зона. Использовать большее усиление вы конечно можете. но получите ассиметричный сигнал - верх обрежется на около 4В. Нам и не нужна большая амплитуда, главное чтобы ардуинка четко разбирала, а ей уже 500мВ достаточно для четкого отслеживания угла наклона джойстика. (в ардуино нано 10бит ацп, 5мВ различает теоретически и бери 10мВ практически, можно было бы и напрямую попробовать работать с 50мВ, но оставлю эти пробы последователям), про 12битные ацп (разрешение типа 1.25мВ на 5В) слышал и про проблемы с ними, тоже можно попробовать, но опять же помним про наводки, провода) Еще один аргумент - попробовать работать с 50мВ напрямую - люди которые будут это использовать, гонять не будут - 5 теоретических "ступенек" они могут и не заметить, главное чтобы не дергало. Зато можно легко использовать оба выхода, суммировать их программно. И это сильно проще. Но тогда надо тянуть много проводов к основному джойстику, или использовать две ардуинки. Т е немного в другом сложность поднабирается.
Для работы ОУ нужен источник опорного напряжения в 2.5В (половина от наших 5В) (есть на схеме в видео) это решается TLE2426ILP - я брал с пошире температурной зоной работы.

А что будет если джойстик залип? Мы же пружинку подрезали, а вдруг грязь. Эти джойстики - не влаго-пыле защищенные. А как переключаться на облегченный? Обязательно нужен второй контур управления! И его я реализовал в виде сенсорной кнопки. Есть готовые модули. Есть  на TTP223 по 20р, но не берите их https://www.aliexpress.com/item/New-Arrival-5Pcs-2-5-5-5V-TTP223-Capacitive-Touch-Switch-Button-Self-Lock-Key-Module/32815544523.html?spm=2114.search0204.3.40.3d4773e8niTQKq&ws_ab_test=searchweb0_0,searchweb201602_8_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910,searchweb201603_51,ppcSwitch_0&algo_expid=20f8ca71-c381-4610-9755-e4163647d382-5&algo_pvid=20f8ca71-c381-4610-9755-e4163647d382
Проблема в том что при долгом нажатии она сбасывается. Но за 20р - возьмите пару удостовериться)
А брать надо на TTP224 4хканальный за 40р https://www.aliexpress.com/item/NEW-4Channel-Digital-Touch-Sensor-Capacitive-Switch-Module-Button-For-Arduino-TTP224/32762184188.html?spm=2114.search0204.3.33.3d4773e8niTQKq&ws_ab_test=searchweb0_0,searchweb201602_8_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910,searchweb201603_51,ppcSwitch_0&algo_expid=20f8ca71-c381-4610-9755-e4163647d382-4&algo_pvid=20f8ca71-c381-4610-9755-e4163647d382
Да, нам не надо 4 канала, но и бог с лишними, зато эта микросхема не сбрасывается, работает как часы и настроек имеет больше (хоть и не потребовались). На практике я этот модуль опилил раза в четыре уменьшив).
Значит так. Кратковременное касание - управление переходит к облегченному джойстику. Долгое (у меня 1.25с) - вернется на родительский. Причем как только коснулся - значение с джойстика не берется - кресло встает. Это защита на случай залипания, иных проблем. Сенсорным я сделал головку винтика вплотную к джойстику - под тот же палец.

Как подрубить все это к родным мозгам. Ничего лучше как в разрыв между родным джойстиком и мозгами - я не придумал. Там 8жил. 5В, земля, 2 канала - Х, 2 канала - Y, отсутствующая кнопка (но провод есть и он нужен), и переключение выходов. https://www.cw-industrialgroup.com/getattachment/a6bb9db0-f4be-47c9-8e9d-e8931694969f/jc2000_brochure
По два канала на Х и Y для проверки работоспособности джойстика - я их также завел на ардуинку и как положено - сравниваю, зачем урезать безопасность если этого можно не делать. А вывод с ардуинки приходится делать с помощью двух платок ЦАП по 60р MCP4725 https://www.aliexpress.com/item/Free-Shipping-12Bit-I2C-DAC-Digital-Converter-Module-MCP4725-Digital-To-Analong-EEPROM-Development-Board-For/32809603330.html?spm=2114.search0204.3.105.95375ffezo0Iaf&ws_ab_test=searchweb0_0,searchweb201602_8_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910,searchweb201603_51,ppcSwitch_0&algo_expid=dc880c2a-70cf-4eef-9164-187efe873c66-16&algo_pvid=dc880c2a-70cf-4eef-9164-187efe873c66
Никаким шимом тут не отделаешься, и думаю делать фильтры типа RC тоже не умно. А ЦАП дает отличный аналоговый 12бит сигнал. Нам нужно от 1.1В до 3.9В, здесь также мы видим защиту от замыкания на плюс или ноль - кресло сразу уходит в ошибку, и правильно. 
5В для питания всего я беру с разъема родного джойстика, там на 0.5А вроде как стабилизатор - за глаза. Ардуинка - внутри основного родительского модуля джойстика, 5В на облегченный джойстик через резистор 220Ом - а вдруг вода попадет в легкий джойстик - ничего не погорит.

Про цены вы все поняли - берите все в тройном размере. Если ничего не сжег - значит не работал. Очень полезны стартовые наборы ардуино с али! Провода я использовал стандартные ардуиновские но они толстоваты для размещения ардуинки внутри, лучше тоньше. Для соединения сенсорного модуля с площадкой, которой касается винтик я использовал 2см экранированного кабеля 1.2мм с али - не знаю надо ли но у меня много его. Длинный провод к облегченному джойстику - те же dupont только в термоусадке, довольно жесткий кабель получился, лучше что помягче сделать. Корпус от https://www.aliexpress.com/item/Joystick-Controller-HHG-JS-for-3-Axis-Basecam-8-32-Bits-Gimbal-Controller-Board/32819446020.html?spm=a2g0s.9042311.0.0.27424c4ds9wXGv
плата для монтажа https://www.aliexpress.com/item/Prototype-PCB-for-Arduino-UNO-R3-Shield-Board-DIY-Combo-2mm-2-54mm-Pitch/32914001432.html?spm=2114.search0204.3.316.2a765bc1kNEdLK&ws_ab_test=searchweb0_0,searchweb201602_8_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910,searchweb201603_51,ppcSwitch_0&algo_expid=9992ed0c-d1c7-4ab3-a3d5-d92dc5a3fdd9-45&algo_pvid=9992ed0c-d1c7-4ab3-a3d5-d92dc5a3fdd9
у 4х пинового джойстика 2мм шаг контактов. Добавил пищалку - сигнализировать о проблемах, пока только о поломке основного джойстика (думаю невероятное событие, выпендреж). Разъем родного джойстика 2х4 2мм шаг - я купил колодку 2х5, обкусил и проводов типа dupont 2мм шаг https://www.aliexpress.com/item/Best-Price-Dupont-Connector-Pin-Header-Housing-Female-2-0mm-Pitch-2x5P-For-DIY-Electronic-Kit/1797160383.html?spm=a2g0s.9042311.0.0.27424c4d4luwWy https://www.aliexpress.com/item/20pcs-in-Row-Dupont-Cable-20cm-2mm-pitch-female-to-female-2P-to-2P-wire-for/32364078824.html?spm=2114.search0204.3.14.6245222agxQO9w&ws_ab_test=searchweb0_0,searchweb201602_8_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910-10889,searchweb201603_51,ppcSwitch_0&algo_expid=6b1a9c7a-8ea0-405c-99b9-30b520614cdb-2&algo_pvid=6b1a9c7a-8ea0-405c-99b9-30b520614cdb

Пробовать все сначала на столе на бредборде!

Короче - обычный детский конструктор на пользу общества! Можно использовать самую разнообразную физику для управления - джойстик это боян. Я НЕ программист, я НЕ электронщик. Я вообще никто, и знаю что теоретически много кто есть, но страна в одном месте и инвалиды сами по себе - ну не смогли найти никого кроме меня...)) Зато теперь вы знаете - это боян. Да, не на пять минут но за полгодика - любой освоится с конструктором для старшеклассников и справится. За то потом и поднастроить можно что хочешь, я сразу режимы дополнительные добавил. И вообще технических проблем у инвалидов много.

Скетч
#include <Wire.h>
#include <EEPROM.h>
#include <Adafruit_MCP4725.h>

Adafruit_MCP4725 dac0;
Adafruit_MCP4725 dac1;
int x;
int y;
int xh;
int yh;
int a;
int b;
int c;
int d;
int bt;
int speedK;
int trig=1;
int trig1=0;
int trig2=0;
int trig3=0;
unsigned long tm1;
unsigned long tm2;
unsigned long tm3;


void setup() {
//Serial.begin(9600);
pinMode(13,INPUT);
pinMode(2,OUTPUT); 
digitalWrite(2,LOW);
dac0.begin(0x61);
dac1.begin(0x60);

//EEPROM.write(0, 0);
speedK = EEPROM.read(0); //здесь задаем тонко скорость
if(analogRead(A7)>650) EEPROM.write(0, max(speedK-1,0));
else if(analogRead(A7)<350) EEPROM.write(0, min(speedK+1,4));
if(analogRead(A6)>650) EEPROM.write(0, 0);
speedK = EEPROM.read(0);
}


void loop() {
a = analogRead(A0); //4 выхода с основного и два с облегченного
b = analogRead(A1);
c = analogRead(A2);
d = analogRead(A3);
yh = analogRead(A6);
xh = analogRead(A7);
bt = digitalRead(13); //сенсорная кнопка на 13ом пине, диод удалить

if(a>550 || a<480 || c>550 || c<480) trig=1; //перехват родительским пультом
if(bt != trig3){
  trig1=trig2;
  trig2=trig3;
  trig3=bt;
  tm1=tm2;
  tm2=tm3;
  tm3=millis();   
}
if(trig1==0 && trig2==1 && trig3==0 && millis()-tm2<1250) trig=0;
if(bt==1) trig=1;

if(abs(a-b)<50 && abs(c-d)<50){
  if(trig==0) { //легкий
   if(yh<=560) y = map(yh,275,512,3196-200*speedK,2048); //центр 560 512 c резистором 220ом
   if(yh>560) y = map(yh,512,660,2048,900+200*speedK); //центр 560 512 c резистором
   //if(yh>510 && yh<=610) y = 2048;
   if(xh<=472) x = map(xh,237,440,3196-200*speedK,2048); //центр 472 440 c резистором
   if(xh>472) x = map(xh,435,660,2048,900+200*speedK);} //центр 472 440 c резистором
   //if(xh>422 && xh<=522) x = 2048;
   if(((x-2048)/10)*((x-2048)/10)+((y-2048)/10)*((y-2048)/10)<225){ //мертвая зона кругом радиус 150
    x=2048;
    y=2048;
   }
   
  if(trig==1){ //родительский
   x = 4*c;
   y = 4*a;}
 
  dac0.setVoltage(x, false); //посылаем на ЦАПы
  dac1.setVoltage(y, false);
  }
  else{ //пищит если сломался родной джойстик
  digitalWrite(2,HIGH);
  delay(500);
  digitalWrite(2,LOW);
  delay(500);
  }

}










Cute-100 350Вт
10s6p NCR18650