Реклама:
Хочешь стать куратором любимой темы?
0 Пользователи и 1 Гость просматривают эту тему.
#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 PINint 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 calculationint bal = 1390; // балансировка колесint vol = 1400; // скоростьint torm = 0; // назад/тормозint last_i_timer = 0; // last way's value sent through PPM signalunsigned 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(" ");}
#define NB_WAY 6 // number of ways#define LOW_LENGTH 300 // How long last (in µs) a low between 2 pulses#define MIN_PPM_PULSE 1300 // minimum pulse length in µs#define PPM_PULSE_LENGTH 700 // how much more µs will last the max pulse length#define PACKET_LENGTH 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)#define PPM_OUTPUT 13 // OUTPUT PINint 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 calculationint last_i_timer = 0; // last way's value sent through PPM signalunsigned long int trame_elapsed_time = 0;bool output_state = LOW;void setup() { // 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();}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() { for(i=0;i<NB_WAY;i++) { // Read current value of way i : p = analogRead(way_pin[i]); // auto calibration... if(p > way_max[i]) way_max[i] = p; if(p < way_min[i]) way_min[i] = p; // Arduino map function sucks way_value[i] = MIN_PPM_PULSE + PPM_PULSE_LENGTH * (float)((float)(p - way_min[i]) / (float)(way_max[i] - way_min[i])); }}
Исходники автор любезно предоставил в 24 -й странице "Трайк из колёс от гироскутера" в разделе Детский электротранспорт. ссылкаС накатом и без тормоза ссылка
Всем привет! Помогите пожалуйста найти прошивку для гироскутера, управление чтоб было с джойстиком, при этом можно было использовать ардуино и настроить параметры под инвалидную коляску. С возможностью использовать дисплей по i2c шине. Буду очень благодарен. Не могу найти прошивку рабочую со скетчем =( Я в первые проект делаю.строго не судите. Плата стандартная джойстик ардуиновский.
У меня все норм. плата: arduino pro mini Рабочий код взял здесь: ссылкавот копипаст:Код: [Выделить]#define NB_WAY 6 // number of ways#define LOW_LENGTH 300 // How long last (in µs) a low between 2 pulses#define MIN_PPM_PULSE 1300 // minimum pulse length in µs#define PPM_PULSE_LENGTH 700 // how much more µs will last the max pulse length#define PACKET_LENGTH 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)#define PPM_OUTPUT 13 // OUTPUT PINint 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 calculationint last_i_timer = 0; // last way's value sent through PPM signalunsigned long int trame_elapsed_time = 0;bool output_state = LOW;void setup() { // 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();}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() { for(i=0;i<NB_WAY;i++) { // Read current value of way i : p = analogRead(way_pin[i]); // auto calibration... if(p > way_max[i]) way_max[i] = p; if(p < way_min[i]) way_min[i] = p; // Arduino map function sucks way_value[i] = MIN_PPM_PULSE + PPM_PULSE_LENGTH * (float)((float)(p - way_min[i]) / (float)(way_max[i] - way_min[i])); }}
возьмите прошивку от Виктора_7 там не надо ардуино там все на прямую сделано и идет она 25 км.час
Автор Mihail91Раздел Гироскутеры (мини-сигвеи)
Автор bobrik93Раздел Детский электротранспорт
Автор Андрей CРаздел Детский электротранспорт
Автор Андрей 1985Раздел Детский электротранспорт
Автор ЭлектрикерРаздел Детский электротранспорт