Бионический протез руки после локтевого сустава

Kelll31

★✩✩✩✩✩✩
29 Дек 2018
25
24
Где то
Всем массовый сап! В этом посте я расскажу и покажу про мой новый проект (уже 2 месяц делаю))
Сначала я разработал пробную модель руки и подобрал модуль ЭМГ. Загоревшись идеей создания бюджетного протеза я полез в интернет за материалом... Не найдя там нужной информации по этой теме я стал сам копаться в ней. Т.к на тот момент я только начинал пользоваться fusion 360, то мои модели выглядели очень "топорно", грубо, ужасно.
1553761853149.png
Но я не сдавался, и поработав над другими моделями освоил эту программу. В итоге у меня вышла красивая модель руки, которую дорабатываю до сих пор.
1553762025373.png
1553762038567.png
1553762058932.png
1553762598265.png
1553762660913.png
Т.к у меня недавно появился 3D принтер, то я решил воссоздать свою задумку в реальный объект. (Это прототип, и он ещё разрабатывается)
j1W9J3_eC4U.jpg
080BLrpYo1o.jpg
ElnbI3gVIlU.jpg
lZVnKpGsfeA.jpg
krfd3ff-W64.jpg
fMl5dNg2KTY.jpg
 
Изменено:

Kelll31

★✩✩✩✩✩✩
29 Дек 2018
25
24
Где то
Здравствуйте снова! Сегодня я хочу поделится своими небольшими успехами в моём старом проекте.

На сегодняшний день я практически полностью изменил начальные железки, и в пакет добавились : Arduino mega, Lcd дисплей 20x4, пищалки, кнопки, 9 транзисторов, переходники для AD3282 и т.д. Схема потеряла : Arduino nano, внешний EEPROM (Не смог нормально его подключить (Читалось только 1024 ячеек))), PCA9685.​

Новое :
  1. Новый, криво оптимизированный код (Спасибо Гуверу за облегчённые библиотеки)
    C++:
    #include <Servo.h>#include <microWire.h>
    #include <microLiquidCrystal_I2C.h>
    
    #include <EEPROM.h> // Подключаем библиотеку
    
    #define korector 12 // Задаем корректор чистки
    #define FirstLaunchButton 9
    #define ElectrodeR 10
    #define ElectrodeL 11
    #define Pishalka 12
    
    Servo mizinec;
    Servo bezimani;
    Servo fuck;
    Servo ukozatel;
    Servo big;
    Servo ladon;
    Servo povorot;
    
    LiquidCrystal_I2C lcd(0x27, 20, 4); // Задаем адрес Lcd монитора
    
    int SignalSDatchika; // Аналоговый сигнал с датчика
    int i; // Сдвиговый регистр
    
    byte index; // Индекс для очистки
    int val_0[3]; // Первый этап очистки (Масcив)
    int val_Srednie_1[3]; // Среднее арифметические 2 (Массив)
    int Srednie_1; // Среднее арифметические 1 (Целое единственное число)
    int Srednie_2; // Среднее арифметические 2 (Целое единственное число)
    
    byte  flash[3000]; //Значения во flash
    
    byte levo8bit[] = {  B00010,  B00011,  B00111,  B01101,  B11111,  B10111,  B10100,  B10011};
    byte pravo8bit[] = {   B01010,  B11001,  B11101,  B10111,  B11110,  B11100,  B00100,  B11000};
    
    void setup() {
      i = 0;
      pinMode(FirstLaunchButton, INPUT);
      pinMode(ElectrodeR, INPUT);
      pinMode(ElectrodeL, INPUT);
      pinMode(Pishalka, OUTPUT);
      mizinec.attach(32);
      bezimani.attach(33);
      fuck.attach(34);
      ukozatel.attach(35);
      big.attach(36);
      ladon.attach(37);
      povorot.attach(38);
    
      lcd.init();  // Инициализируем Lcd
      lcd.init();  // Инициализируем Lcd X2
      lcd.backlight();
      lcd.setCursor(0, 1);
      lcd.print("Kelll31 Technology");
      lcd.createChar(0, levo8bit);
      lcd.createChar(1, pravo8bit);
      lcd.setCursor(18, 1);
      lcd.write(0);
      lcd.write(1);
      delay(3000);
      if (digitalRead(FirstLaunchButton) == 1) {
        lcd.clear();
        lcd.setCursor(1, 0);
        lcd.print("First Launch");
        delay(3000);
        SearchSzhatie();
        Pisk();
        delay(3000);
        SearchRazhatie();
        Pisk();
        delay(3000);
        SearchPovorotVLevo();
        Pisk();
        delay(3000);
        SearchPovorotVPravo();
        lcd.clear();
        lcd.setCursor(1, 0);
        lcd.print("First Launch");
        lcd.setCursor(8, 1);
        lcd.print("Ok");
        Pisk();
        Pisk();
        delay(3000);
      }
      SearchValues();
      delay(1000);
    }
    
    void loop() {
      if (digitalRead(ElectrodeR) == 1 || digitalRead(ElectrodeL) == 1) {
        proverka();
      }
      Sravnenie();
    
    }
    
    void Pisk() {
      digitalWrite(Pishalka, HIGH);
      delay(250);
      digitalWrite(Pishalka, LOW);
      delay(250);
    }
    
    void SzhadieDo() {
      //Здесь должен быть код
    
    }
    
    void RazhatieDo() {
      //Здесь должен быть код
    
    }
    
    void PovorotVLevoDo() {
      //Здесь должен быть код
    
    
    }
    
    void PovorotVPravoDo() {
      //Здесь должен быть код
    
    }
    
    void Sravnenie() {
    nachalo:
      lcd.clear();
      lcd.home();
      lcd.print("Normal mode");
      lcd.setCursor(0, 1);
      lcd.print(Srednie_2);
      delay(5);
      i = 0;
      chistka();
      logika();
      while (i < 2999) {
        i = i + 1;
        if ((i <= 750)  && ((Srednie_2 >= flash[i] + korector) or (Srednie_2 <= flash[i] + korector))) {
          SzhadieDo();
        }
        else {
          goto nachalo;
        }
        if ((((i >= 750) && (i <= 1500))) &&  ((Srednie_2 >= flash[i] + korector) or (Srednie_2 <= flash[i] + korector))) {
          RazhatieDo();
        }
        else {
          goto nachalo;
        }
        if ((((i >= 1500) && (i <= 2250)))   && ((Srednie_2 >= flash[i] + korector) or (Srednie_2 <= flash[i] + korector))) {
          PovorotVLevoDo();
        }
        else {
          goto nachalo;
        }
        if ((((i >= 2250) && (i <= 2999)))  && ((Srednie_2 >= flash[i] + korector) or (Srednie_2 <= flash[i] + korector))) {
          PovorotVPravoDo();
        }
        else {
          goto nachalo;
        }
      }
    
    }
    
    void SearchSzhatie() {
      i = 0;
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Szhozmite hand");
      delay(4000);
      Pisk();
      lcd.setCursor(1, 2);
      lcd.print("Write to memory...");
      while (i < 750) {
        i = i + 1;
        lcd.clear();
        lcd.setCursor(1, 2);
        lcd.print("Write to memory...");
        delay(2);
        chistka();
        logika();
        lcd.clear();
        lcd.setCursor(1, 2);
        lcd.print("Write to memory..");
        delay(3);
        VEEPROM();
      }
      lcd.clear();
      lcd.home();
      lcd.print("Szhatie = Ok");
    }
    
    void SearchRazhatie() {
      i = 750;
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Razoshmite hand");
      delay(4000);
      Pisk();
      lcd.setCursor(1, 2);
      lcd.print("Write to memory...");
      while (i < 1500) {
        i = i + 1;
        lcd.clear();
        lcd.setCursor(1, 2);
        lcd.print("Write to memory...");
        delay(2);
        chistka();
        logika();
        lcd.clear();
        lcd.setCursor(1, 2);
        lcd.print("Write to memory..");
        delay(3);
        VEEPROM();
      }
      lcd.clear();
      lcd.home();
      lcd.print("Razhatie = Ok");
    }
    
    void SearchPovorotVLevo() {
      i = 1500;
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Povernite hand");
      lcd.setCursor(3, 1);
      lcd.print("V Levo");
      delay(4000);
      Pisk();
      lcd.setCursor(1, 2);
      lcd.print("Write to memory...");
      while (i < 2250) {
        i = i + 1;
        lcd.clear();
        lcd.setCursor(1, 2);
        lcd.print("Write to memory...");
        delay(2);
        chistka();
        logika();
        lcd.clear();
        lcd.setCursor(1, 2);
        lcd.print("Write to memory..");
        delay(3);
        VEEPROM();
      }
      lcd.clear();
      lcd.home();
      lcd.print("Povorot V Levo = Ok");
    }
    
    void SearchPovorotVPravo() {
      i = 2250;
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Povernite hand");
      lcd.setCursor(3, 1);
      lcd.print("V Pravo");
      delay(3000);
      Pisk();
      lcd.setCursor(1, 2);
      lcd.print("Write to memory...");
      while (i < 3000) {
        i = i + 1;
        lcd.clear();
        lcd.setCursor(1, 2);
        lcd.print("Write to memory...");
        delay(2);
        chistka();
        logika();
        lcd.clear();
        lcd.setCursor(1, 2);
        lcd.print("Write to memory..");
        delay(3);
        VEEPROM();
      }
      lcd.clear();
      lcd.home();
      lcd.print("Povorot V Pravo = Ok");
    }
    
    void VEEPROM() {
      EEPROM.update(i, Srednie_2);
    }
    
    void SearchValues() {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Search values");
      lcd.setCursor(1, 1);
      lcd.print("in EEPROM");
      while (i < 2999) {
        i = i + 1;
        lcd.setCursor(0, 2);
        lcd.print(i);
        flash[i] = EEPROM.read(i);
      }
      lcd.setCursor(10, 2);
      lcd.print("Ok");
      Pisk();
      delay(250);
      Pisk();
    }
    
    void proverka() {
      while (digitalRead(ElectrodeR) == 1 || digitalRead(ElectrodeL) == 1) {
        lcd.clear();
        lcd.home();
        lcd.print("No electrodes connected");
        lcd.setCursor(0, 1);
        lcd.print("Waiting for connection");
      }
      lcd.clear();
      lcd.home();
      lcd.print("Electrodes found");
      delay(3000);
    }
    
    void chistka() {
    
      SignalSDatchika = analogRead(A0);
    
      if (index > 2) index = 0; // переключаем индекс с 0 до 2 (0, 1, 2, 0, 1, 2…)
      val_0[index] = SignalSDatchika; // записываем значение с датчика в массив
      index = index + 1;
    
      if (index > 2) index = 0; // переключаем индекс с 0 до 2 (0, 1, 2, 0, 1, 2…)
      val_Srednie_1[index] = Srednie_1;
      index = index + 1;
    
    }
    
    void logika() {
    
    
      if (SignalSDatchika >= korector) {
        Srednie_1 = (val_0[0] + val_0[1] + val_0[2]) / 3;
      }
    
      if (val_Srednie_1[0] >= 1 || val_Srednie_1[1] >= 1 || val_Srednie_1[2] >= 1) {
        Srednie_2 = (val_Srednie_1[0] + val_Srednie_1[1] + val_Srednie_1[2]) / 3;
      }
      Srednie_2 = map(Srednie_2, 0, 820, 0, 255);
    }
  2. Разработана принципиальная и PCB схемы
    ПринципиальнаяSchematic_Bionic-hand_Bionic-Hand.png ВерхPCB_Bionic-Hand-PCB_UP.png НизPCB_Bionic-Hand-PCB_DOWN.png
  3. Допиленная 3D модель
    1575287796185.png 1575287814265.png 1575287858839.png3D модель выложу когда допилю весь проект)
Спасибо за внимание!
 

Kelll31

★✩✩✩✩✩✩
29 Дек 2018
25
24
Где то
Сап всем! Я ещё не умер, и допиливаю проект)
Новое :
1.
C++:
 А его здесь нету( т.к он стал слишком большим и теперь его можно найти ниже
}
код
2.
Schematic_Bionic hand_Bionic Hand 2_20200120202535.png
3.
1579541216589.png1579541235683.png1579541250391.png
4. И самое главное что я осел на Github`е, и именно там вы сможете найти самые новые файлы и новости по проекту (если вам интересно, гег).

P.s Спасибо за внимание
 
  • Лойс +1
Реакции: GODUB и Danchik