Реклама: Инвалидная коляска и гироскутер с дисплеем и джойстиком.

 

Хочешь стать куратором любимой темы?

* Комментарии к новостям

1. готовые китайские субмодули и прочая силовая электроника (Микроэлектроника) от edw123 (11.06.2023 в 01:12)2. Клуб 2х2 (Электровелосипеды) от edw123 (11.06.2023 в 01:05)3. Контроллеры с импульсным троганием (толчком) (Микроэлектроника) от edw123 (11.06.2023 в 01:04)4. Электросамокат и ПДД (Электросамокаты) от edw123 (11.06.2023 в 00:56)5. Kugoo m2 pro (Электросамокаты Kugoo M и G серии и аналоги ) от Аддрей Ветврач M2PRO (11.06.2023 в 00:51)6. Рычажно-маятниковая вилка А.Ленхерра-Р.Вебера для элетро моцика "Антилопа Гну". (Наше творчество) от АлексейX (11.06.2023 в 00:08)
7. Учимся сваривать аккумуляторы в батареи... Трансформаторная версия. (Инструменты и технологии) от Silvaticus (11.06.2023 в 00:04)8. Посторонние звучки мотор-колеса. (Электровелосипеды) от Statik (10.06.2023 в 23:46)9. Загорелся аккумулятор + квартира (МЫ) от Silvaticus (10.06.2023 в 23:43)10. Электровелосипед складной для мегаполиса (Электровелосипеды) от ВикторНН (10.06.2023 в 22:28)11. Kugoo M4 pro 16Aч (Электросамокаты Kugoo M и G серии и аналоги ) от 13_chip_13 (10.06.2023 в 22:13)12. BMS с контролем напряжений ячеек по bluetooth (Системы управления аккумуляторными батареями (BMS)) от Андрей3 (10.06.2023 в 21:59)

Прочитано 3748 раз

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

22 Июл 2019 в 12:03
Прочитано 3748 раз
Оффлайн

Александр91

Сообщений: 8
Всем привет!
Появился проект "Инвалидная коляска и гироскутер с джойстиком"
На порту сейчас имею прошитую уже плату от темы  ссылка
Есть дисплей 128х64 oled i2c.
Джойстик для проектов Ардуино.
Плата Arduino Uno.
Залил скетч на uno, подключил к плате и у меня автоматически запустились двигатели на гироскутере. Используя 13 пин на Uno, зеленый провод от гироскутера и землю. Подключил джойстик из темы, на A0, A1. Джойстик не реагировал совсем. Питание правда для теста использовал от пк на ардуино.
Что я делаю не так? =( Помогите ребят. смотрел много тем на данную тематику. Не чего не мог найти нормально =(
« Последнее редактирование: 22 Июл 2019 в 12:13 от Александр91 »


22 Июл 2019 в 12:21
Ответ #1
Оффлайн

verial

Россия, Москва Сообщений: 1230

а dc/dc преобразователь с 5 вольт в 3 вольта поставили на uart дело в том что rx tx на stm32 3.3 вольта а арда дает все 5 вольт?
« Последнее редактирование: 22 Июл 2019 в 12:26 от verial »


22 Июл 2019 в 12:26
Ответ #2
Оффлайн

Александр91

Сообщений: 8
а dc/dc преобразователь с 5 вольт в 3 вольта поставили на uart дело в том что rx tx на stm32 3.3 вольта а арда дает все 5 вольт?
Да, я подключал пока от пк. Там 5 вольт.можно же использовать 3.3 вольта от разъема для прошивки. но куда его на ардуино подключать? в какой пин?


22 Июл 2019 в 12:27
Ответ #3
Оффлайн

verial

Россия, Москва Сообщений: 1230


22 Июл 2019 в 12:30
Ответ #4
Оффлайн

Александр91

Сообщений: 8
откуда вы взяли прошивку?
от  ссылка
Можете скинуть прошивку для гироскутера?


22 Июл 2019 в 12:35
Ответ #5
Оффлайн

verial

Россия, Москва Сообщений: 1230
вы ее конфигурировали под uart или взяли так по умолчанию?
и скиньте сюда ваш скетч.


22 Июл 2019 в 12:36
Ответ #6
Оффлайн

Александр91

Сообщений: 8
вы ее конфигурировали под uart или взяли так по умолчанию?
и скиньте сюда ваш скетч.
по умолчанию
#define NB_WAY 2 // number of ways
#define LOW_LENGTH 100 // How long last (in µs) a low between 2 pulses
#define MIN_PPM_PULSE 1300 // 1300 minimum pulse length in µs
#define PPM_PULSE_LENGTH 700 //700 how much more µs will last the max pulse length
#define PACKET_LENGTH 21000 //21000, How long (µs) last a full trame
// trame length is fixed ! Every trame will make PACKET_LENGTH µs !
// MUST NO BE MORE THAN 32ms !!! (timer's prescaler constraint)

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // зеленый!          set the LCD address to 0x20 for a 16 chars and 2 line display

#define PPM_OUTPUT 13 // OUTPUT PIN

int way_value[NB_WAY];
int way_pin[NB_WAY];
int way_min[NB_WAY];
int way_max[NB_WAY];

int i = 0;
int p = 0; // temp var for duty cycle calculation
int bal = 1390; // балансировка колес
int vol = 1400; // скорость
int torm = 0; // назад/тормоз
int last_i_timer = 0; // last way's value sent through PPM signal
unsigned long int trame_elapsed_time = 0;
bool output_state = LOW;


void setup() {
  Serial.begin(115200);
  Serial.println("ppm_motors");
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);

  // ppm output :
  pinMode(PPM_OUTPUT, OUTPUT);
  digitalWrite(PPM_OUTPUT, output_state);

  // inits arrays
  for (i = 0; i < NB_WAY; i++)
  {
    way_pin[i] = 14 + i;
    pinMode(way_pin[i], INPUT);
    way_value[i] = analogRead(way_pin[i]);
    way_min[i] = way_value[i];
    way_max[i] = way_value[i];
  }

  // init timer
  cli();          // desactivation interruptions
  TCCR1A = 0x00;  // set timer1 registers to 0
  TCCR1B = 0x00;
  TIMSK1 = 0x00;

  OCR1A = 65535;// set to the max
  // CTC mode:
  TCCR1B |= (1 << WGM12);
  // prescaler to 8, that allow (@16mhz) 32.8ms trame
  TCCR1B |= (0 << CS10);
  TCCR1B |= (1 << CS11);
  TCCR1B |= (0 << CS12);
  // timer activation
  TIMSK1 |= (1 << OCIE1A);
  sei();
  lcd.init();     // initialize the lcd
  lcd.backlight();
  lcd.print("---ppm---");
  delay(1000);
  lcd.clear();
}

ISR(TIMER1_COMPA_vect)
{
  TIMSK1 &= (0 << OCIE1A);
  if (output_state)
  { // END OF A HIGH, we have to wait LOW_LENGTH ms before next pulse
    output_state = LOW;
    digitalWrite(PPM_OUTPUT, output_state);
    OCR1A = 2 * LOW_LENGTH; // set when next timer interruption will occur
    TIMSK1 |= (1 << OCIE1A);  // restart timer
    trame_elapsed_time += LOW_LENGTH;
  }
  else
  { // END of a LOW_LENGTH, new pulse !
    output_state = HIGH;
    digitalWrite(PPM_OUTPUT, output_state);
    if (last_i_timer >= NB_WAY) // last way, so wait until next packet
    {
      OCR1A = (2 * PACKET_LENGTH) - (trame_elapsed_time * 2);// set when next timer interruption will occur
      TIMSK1 |= (1 << OCIE1A); // restart timer
      last_i_timer = 0;
      trame_elapsed_time = 0;
    }
    else
    {
      OCR1A = 2 * way_value[last_i_timer];// set when next timer interruption will occur
      TIMSK1 |= (1 << OCIE1A); // restart timer
      last_i_timer ++;
      trame_elapsed_time += way_value[NB_WAY];
    }
  }
}


void loop() {
  v_lcd();

  bal = analogRead(A0);
  vol = analogRead(A1);
  torm = analogRead(A2);

  // баланс между колес
  way_value[0] = map(bal, 0, 1023, 1300, 1500); //  1395 +- 500

  // скорость
  way_value[1] = map(vol, 788, 120, 1395, 1950); // 800 мин и 2000 макс (1100 медленный назад)

  // на a1 менее 535 включается задний ход
  // 1385 стоп. 1950 полный ход

  // педаль тормоза
  if (torm < 800) {
    way_value[1] = map(torm, 800, 160, 1350, 1100);
  }

}


void v_lcd()
{
  lcd.setCursor(0, 0);  lcd.print(bal);  lcd.print(" ");
  lcd.setCursor(0, 1);  lcd.print(vol);  lcd.print(" ");
  lcd.setCursor(7, 0);  lcd.print(way_value[0]);  lcd.print(" ");
  lcd.setCursor(7, 1);  lcd.print(way_value[1]);   lcd.print(" ");
}



22 Июл 2019 в 12:40
Ответ #7
Оффлайн

verial

Россия, Москва Сообщений: 1230
там в конфиге есть строчка : //#define CONTROL_SERIAL_USART2       // left sensor board cable, disable if ADC or PPM is used! там надо убрать // что бы работал uart/


22 Июл 2019 в 12:42
Ответ #8
Оффлайн

Александр91

Сообщений: 8
там в конфиге есть строчка : //#define CONTROL_SERIAL_USART2       // left sensor board cable, disable if ADC or PPM is used! там надо убрать // что бы работал uart/
Можешь пожалуйста скинуть готовую прошивку. Буду очень признателен.


22 Июл 2019 в 12:46
Ответ #9
Оффлайн

verial

Россия, Москва Сообщений: 1230
дело в том что у них щаз программа работает с тремя видами управления нунчаки, ppm и аналог.
они щаз переделывают uart в другой протокол и я тоже завис с ихнем управлением.
« Последнее редактирование: 22 Июл 2019 в 13:01 от verial »


22 Июл 2019 в 12:49
Ответ #10
Оффлайн

Александр91

Сообщений: 8
дело в том что у них щаз программа работает с тремя видами управления нунчаки, ppm и аналог.
они щаз переделывают uarn в другой протокол и я тоже завис с ихнем управлением.
А есть прошивка где будет просто работать джойстик без ардуино с выполнением поворотов, назад и вперед?  мне надо с ppm
« Последнее редактирование: 22 Июл 2019 в 13:00 от Александр91 »


22 Июл 2019 в 13:01
Ответ #11
Оффлайн

verial

Россия, Москва Сообщений: 1230
Есть, работает только от ppm вам подойдет?


22 Июл 2019 в 13:18
Ответ #12
Оффлайн

Александр91

Сообщений: 8
Есть, работает только от ppm вам подойдет?
да=) и схему подключения и скетч, если у вас свой.


22 Июл 2019 в 14:47
Ответ #13
Оффлайн

ЭФЭ

Россия, Уфа Сообщений: 178
видами управления нунчаки,
Не подскажите, что такое "нунчаки"?


22 Июл 2019 в 14:51
Ответ #14
Оффлайн

verial

Россия, Москва Сообщений: 1230


22 Июл 2019 в 15:00
Ответ #15
Оффлайн

verial

Россия, Москва Сообщений: 1230


22 Июл 2019 в 16:27
Ответ #16
Оффлайн

ЭФЭ

Россия, Уфа Сообщений: 178


22 Июл 2019 в 19:49
Ответ #17
Оффлайн

fedy

Сообщений: 63
по умолчанию
#define NB_WAY 2 // number of ways
#define LOW_LENGTH 100 // How long last (in µs) a low between 2 pulses
#define MIN_PPM_PULSE 1300 // 1300 minimum pulse length in µs
#define PPM_PULSE_LENGTH 700 //700 how much more µs will last the max pulse length
#define PACKET_LENGTH 21000 //21000, How long (µs) last a full trame
// trame length is fixed ! Every trame will make PACKET_LENGTH µs !
// MUST NO BE MORE THAN 32ms !!! (timer's prescaler constraint)

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // зеленый!          set the LCD address to 0x20 for a 16 chars and 2 line display

#define PPM_OUTPUT 13 // OUTPUT PIN

int way_value[NB_WAY];
int way_pin[NB_WAY];
int way_min[NB_WAY];
int way_max[NB_WAY];

int i = 0;
int p = 0; // temp var for duty cycle calculation
int bal = 1390; // балансировка колес
int vol = 1400; // скорость
int torm = 0; // назад/тормоз
int last_i_timer = 0; // last way's value sent through PPM signal
unsigned long int trame_elapsed_time = 0;
bool output_state = LOW;


void setup() {
  Serial.begin(115200);
  Serial.println("ppm_motors");
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);

  // ppm output :
  pinMode(PPM_OUTPUT, OUTPUT);
  digitalWrite(PPM_OUTPUT, output_state);

  // inits arrays
  for (i = 0; i < NB_WAY; i++)
  {
    way_pin[i] = 14 + i;
    pinMode(way_pin[i], INPUT);
    way_value[i] = analogRead(way_pin[i]);
    way_min[i] = way_value[i];
    way_max[i] = way_value[i];
  }

  // init timer
  cli();          // desactivation interruptions
  TCCR1A = 0x00;  // set timer1 registers to 0
  TCCR1B = 0x00;
  TIMSK1 = 0x00;

  OCR1A = 65535;// set to the max
  // CTC mode:
  TCCR1B |= (1 << WGM12);
  // prescaler to 8, that allow (@16mhz) 32.8ms trame
  TCCR1B |= (0 << CS10);
  TCCR1B |= (1 << CS11);
  TCCR1B |= (0 << CS12);
  // timer activation
  TIMSK1 |= (1 << OCIE1A);
  sei();
  lcd.init();     // initialize the lcd
  lcd.backlight();
  lcd.print("---ppm---");
  delay(1000);
  lcd.clear();
}

ISR(TIMER1_COMPA_vect)
{
  TIMSK1 &= (0 << OCIE1A);
  if (output_state)
  { // END OF A HIGH, we have to wait LOW_LENGTH ms before next pulse
    output_state = LOW;
    digitalWrite(PPM_OUTPUT, output_state);
    OCR1A = 2 * LOW_LENGTH; // set when next timer interruption will occur
    TIMSK1 |= (1 << OCIE1A);  // restart timer
    trame_elapsed_time += LOW_LENGTH;
  }
  else
  { // END of a LOW_LENGTH, new pulse !
    output_state = HIGH;
    digitalWrite(PPM_OUTPUT, output_state);
    if (last_i_timer >= NB_WAY) // last way, so wait until next packet
    {
      OCR1A = (2 * PACKET_LENGTH) - (trame_elapsed_time * 2);// set when next timer interruption will occur
      TIMSK1 |= (1 << OCIE1A); // restart timer
      last_i_timer = 0;
      trame_elapsed_time = 0;
    }
    else
    {
      OCR1A = 2 * way_value[last_i_timer];// set when next timer interruption will occur
      TIMSK1 |= (1 << OCIE1A); // restart timer
      last_i_timer ++;
      trame_elapsed_time += way_value[NB_WAY];
    }
  }
}


void loop() {
  v_lcd();

  bal = analogRead(A0);
  vol = analogRead(A1);
  torm = analogRead(A2);

  // баланс между колес
  way_value[0] = map(bal, 0, 1023, 1300, 1500); //  1395 +- 500

  // скорость
  way_value[1] = map(vol, 788, 120, 1395, 1950); // 800 мин и 2000 макс (1100 медленный назад)

  // на a1 менее 535 включается задний ход
  // 1385 стоп. 1950 полный ход

  // педаль тормоза
  if (torm < 800) {
    way_value[1] = map(torm, 800, 160, 1350, 1100);
  }

}


void v_lcd()
{
  lcd.setCursor(0, 0);  lcd.print(bal);  lcd.print(" ");
  lcd.setCursor(0, 1);  lcd.print(vol);  lcd.print(" ");
  lcd.setCursor(7, 0);  lcd.print(way_value[0]);  lcd.print(" ");
  lcd.setCursor(7, 1);  lcd.print(way_value[1]);   lcd.print(" ");
}


если использовать данный скетч. он под ppm
то и прошивку в гироскутер надо делать под ppm
вот:

// ############################### INPUT ###############################

// ###### CONTROL VIA UART (serial) ######
//#define CONTROL_SERIAL_USART2       // left sensor board cable, disable if ADC or PPM is used!
//#define CONTROL_BAUD       19200    // control via usart from eg an Arduino or raspberry
// for Arduino, use void loop(void){ Serial.write((uint8_t *) &steer, sizeof(steer)); Serial.write((uint8_t *) &speed, sizeof(speed));delay(20); }

// ###### CONTROL VIA RC REMOTE ######
// left sensor board cable. Channel 1: steering, Channel 2: speed.
#define CONTROL_PPM                 // use PPM-Sum as input. disable CONTROL_SERIAL_USART2!
#define PPM_NUM_CHANNELS 2          // total number of PPM channels to receive, even if they are not used.

// ###### CONTROL VIA TWO POTENTIOMETERS ######
// ADC-calibration to cover the full poti-range: connect potis to left sensor board cable (0 to 3.3V) (do NOT use the red 15V wire in the cable!). see <How to calibrate>. turn the potis to minimum position, write value 1 to ADC1_MIN and value 2 to ADC2_MIN. turn to maximum position and repeat it for ADC?_MAX. make, flash and test it.
//#define CONTROL_ADC                 // use ADC as input. disable CONTROL_SERIAL_USART2!
//#define ADC1_MIN 0                // min ADC1-value while poti at minimum-position (0 - 4095)
//#define ADC1_MAX 4095               // max ADC1-value while poti at maximum-position (0 - 4095)
//#define ADC2_MIN 0                // min ADC2-value while poti at minimum-position (0 - 4095)
//#define ADC2_MAX 4095               // max ADC2-value while poti at maximum-position (0 - 4095)

// ###### CONTROL VIA NINTENDO NUNCHUCK ######
// left sensor board cable. keep cable short, use shielded cable, use ferrits, stabalize voltage in nunchuck, use the right one of the 2 types of nunchucks, add i2c pullups. use original nunchuck. most clones does not work very well.
//#define CONTROL_NUNCHUCK            // use nunchuck as input. disable DEBUG_SERIAL_USART3!

(вчера дал не тот пример, поправил)
« Последнее редактирование: 23 Июл 2019 в 10:28 от fedy »