Занимаясь индивидуальным средством передвижения, я окончательно закрыл вопрос первой части своего проекта, а именно, из чего и каким образом мне доступно собрать электронные мозги.
В промышленных образцах они дюже умные и дорогущие, привязаны к сложным контроллерам, а потому и не каждому доступные.
На первый взгляд, сложного ничего вроде бы и нет, подумаешь диво, вот на одном колесе с педалями, катаются люди. Ну да, учиться нужно, а кто говорит, что это легко. В итоге, чтобы не рухнуть, наездник постоянно наваливает на педали выравнивая вертикальное положение.
Другое дело на электрическом моноцикле, педали есть, но на них стоят, а вот за вертикальное положение райдера отвечают электронные мозги.
Как они работают? Если по-простому, мозжечком конструкции, я думаю, является гироскоп. Он следит и контролирует (отслеживает) положение моноколёсника. Контроллер обрабатывает полученную информацию с гироскопа и управляет полумостами, разгоняя или притормаживая электрический двигатель.
А почему бы, пусть и отдаленно, не повторить то, что управляет моноколесом? В радио лавке приобрел GY-521 MPU-6050 3х осевой гироскоп и arduino uno.
Скетч, который хотелось по первоначальной задумке не нашелся, пришлось импровизировать. Скачал программу для управления сервоприводом. Подкупило то, что был быстрый отклик серводвигателя на манипуляции гироскопа после установки программы в плату arduino.
// MPU6050 & Servo
// https://www.giuseppecaccavale.it/
// Giuseppe Caccavale
#include <SPI.h>
#include <Wire.h>
#include <Servo.h>
#define MPU 0x68 // I2C address of the MPU-6050
Servo ServoX, ServoY;
double AcX, AcY, AcZ;
int Pitch, Roll;
void setup() {
Serial.begin(9600);
ServoX.attach(8);
ServoY.attach(9);
init_MPU(); // Inizializzazione MPU6050
}
void loop()
{
FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ.
Roll = FunctionsPitchRoll(AcX, AcY, AcZ); //Calcolo angolo Roll
Pitch = FunctionsPitchRoll(AcY, AcX, AcZ); //Calcolo angolo Pitch
int ServoRoll = map(Roll, -90, 90, 0, 179);
int ServoPitch = map(Pitch, -90, 90, 179, 0);
ServoX.write(ServoRoll);
ServoY.write(ServoPitch);
Serial.print("Pitch: "); Serial.print(Pitch);
Serial.print("\t");
Serial.print("Roll: "); Serial.print(Roll);
Serial.print("\n");
}
void init_MPU() {
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
delay(1000);
}
//Funzione per il calcolo degli angoli Pitch e Roll
double FunctionsPitchRoll(double A, double B, double C) {
double DatoA, DatoB, Value;
DatoA = A;
DatoB = (B * B) + (C * C);
DatoB = sqrt(DatoB);
Value = atan2(DatoA, DatoB);
Value = Value * 180 / 3.14;
return (int)Value;
}
//Funzione per l'acquisizione degli assi X,Y,Z del MPU6050
void FunctionsMPU() {
Wire.beginTransmission(MPU);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // request a total of 14 registers
AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
}
И так, реакцию серводвигателя на движение я получил.
Показалось, что мечты сбываются. Закрепи переменный резистор на валу «серво» и мозги моноколеса в «банке». Но нет, от этого варианта пришлось отказаться, что бы резистор провернулся полностью на всю, райдер должен был бы сделать сальто. Решил пойти другим путем, как В. И. Ленин. ШИМ спаял на НЕ555.
Но вот проблема как эту приблуду объединить с гироскопом, немного поэкспериментировав, я нашел вариант, замены механического резистора. Просто собрал последовательно один построечный и четыре постоянных резистора.
В итоге моя версия с ШИМ получилась с электрическим резистором. Переключение оборотов двигателя происходит не плавно, а ступенчато. А это практически исключит дребезг гироскопа. То есть, первая ступень подключения начинает вращение двигателя, следующие ступени разгоняют до максимума.
Хорошо, но как допустим на ходу подключать вовремя нужное сопротивление, и на этот случай был найден выход, Датчики Холла, отличный для этого вариант. При воздействии на них соответственным магнитным полем, они срабатывают и выдают отрицательное напряжение,
которое, если подавать на нужное сопротивление, на выходе ШИМ выдаст нужное напряжение.
Из ПВХ согнул колодочку под радиус вращения магнитов сервы и на ее приклеил датчики Холла.
Центральный датчик, должен отключать питание при вертикальном положении гироскопа. Остальные, включаясь магнитным полем, если задействовать светодиоды, зажигают их по очереди.
Подключив мультиметр, я настроил выходное напряжение с ШИМ на четыре режима: 1-4v, 2-6v, 3-9v, 4-12v. Холлы с левой стороны и правой подключены синхронно, то есть в режиме реверс, электрический резистор один.
А еще получил приятный бонус: при накладывании сигналов с датчиков, рабочее напряжение устанавливается по последнему включенному датчику Холла. Если проще, датчик Холла включил 6v и он еще не отключился, следующий датчик Холла выдал команду на новое включение. Напряжение на выходе ШИМ перейдет на 9v.
Все проверил, все настроил. Сборку реверса пока отложил, на определился на каком двигателе остановиться. К выходу ШИМ пристроил мосфет и коллекторный двигатель от шуруповерта, захотелось наглядно увидеть, не слишком ли жестко происходит переключение режимов скорости вращения.
Вертикальное положение - двигатель не запустился.
Наклон примерно два градуса – двигатель запустился сразу на четверть мощности и чем глубже проваливаю наклон, тем резвее крутит двигатель. Самый максимум: примерно двадцать - двадцать три градуса.
По сути, получилась педаль газа для транспортного средства. Скорее всего сначала я испробую на колесе с коллекторным двигателем. Так как трех фазный двигатель надо перебрать на двадцать четыре магнита, сейчас в нем шестналцать и провод в катушках перемотать шиной из двадцати проводков по 0.5 мм, а сейчас всего восемь. С проводом мне подфартило, на попе нашел, среди прочего, не полную катушку, два +, килограмма, советского провода 0.5 мм, кто-то очень давно ее прикопал, завернув в рубероид.