Левитация долгое время считалась чем то сверхъестественным, магическим. Люди долгое время преклонялись перед ней, не знали как ее объяснить. Но постепенно наука сумела объяснить принцип этого явления и с тех пор она стала достаточно привычным явлением, но, тем не менее, она продолжает удивлять людей. В данной статье мы рассмотрим проект простейшего магнитного левитатора на основе платы Arduino.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress). Можно использовать любую плату Arduino, но шилд в данном проекте приведен для платы Arduino Nano.
- Электромагнит диаметром 25 мм, работающий от 12 В.
- Linear Hall Effect Sensor 49E (датчик Холла 49E). Не используйте переключатель Холла (hall effect switch).
- Darlington High Power Transistor TIP 120 (транзисторная пара Дарлингтона).
- Резистор 1 кОм (купить на AliExpress).
- Высокоскоростной диод 1N4007 (купить на AliExpress).
- Источник питания 12 В 1 А.
- SparkFun Pushbutton switch 12mm (кнопочный переключатель).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Основные принципы работы проекта
В данном проекте мы рассмотрим создание магнитного левитатора на основе платы Arduino. Основу (корпус) данного левитатора, можно напечатать на 3D принтере, необходимые файлы для этого можно скачать по следующей ссылке - https://www.thingiverse.com/thing:1392023.
Особенности проекта:
- легко напечатать на 3D принтере и собрать (только клей, никаких болтов);
- необходимо просто загрузить скетч проекта (Levitator.ino) в плату Arduino;
- нет необходимости постоянного подключения к компьютеру, необходим просто источник питания с напряжением 12V;
- для настройки постоянной позиции магнита используются переключатели;
- можно использовать окно монитора последовательной связи (arduino serial monitor) для контроля корректной работы проекта;
- можно изменять код программы по своему желанию.
Вы можете использовать protoboard (печатная плата для и прототипирования) или сделать свою собственную плату. Скачать необходимые для этого файлы можно по следующей ссылке - http://www.thingiverse.com/thing:1392530.
Также купить плату для данного проекта можно в этом месте - https://oshpark.com/shared_projects/kxH3Ak1b (ну для жителей России и СНГ, конечно, не очень демократичная цена за такую маленькую плату :D).
Особое внимание при реализации проекта уделите следующим вещам:
- размещайте датчик Холла внизу наконечника, более подробно его размещение вы можете посмотреть на изображениях проекта (top_sensor.stl);
- для корректной работы датчик Холла должен быть на расстоянии, по меньшей мере, 5 мм от электромагнита;
- вы можете использовать другой датчик Холла (но не используйте hall sensor switch (датчик Холла в виде переключателя));
- используйте неодимовые постоянные магниты (может не работать с обычными магнитами);
- тяжелые объекты более устойчивы;
- модель левитатора для печати на 3D принтере - https://www.thingiverse.com/make:201394;
- шилд для Arduino Nano - https://www.thingiverse.com/make:201420.
Схема проекта
Схема магнитного левитатора на основе платы Arduino представлена на следующем рисунке.
Исходный код программы (скетча)
Код программы простой (без PID контроллера)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
//=========================================================| // Ekobots Innovation Ltda - www.ekobots.com.br | // Juan Sirgado y Antico - www.jsya.com.br | //---------------------------------------------------------| // Program Magnetic Levitator - 2016/02/06 | // All rights reserved 2016 | //=========================================================| int anaPin = 1; // Arduino Analogic Pin 1; int digPin = 5; // Arduino Digital Pin 5; int subPin = 7; // Arduino Digital Pin 7; int addPin = 8; // Arduino Digital Pin 8; // int anaVal = 0; // Analogic Read(Hall Sensor) Value; boolean digVal = 0; // Digital Write(Electromagnet) Value; // int levVal = 228; // Levitation Point Value; (значение точки левитации) int dlyVal = 250; // Delay Value Micro Seconds (задержка в микросекундах); //---------------------------------------------------------| void setup() { // Levitator initialization Begin; Serial.begin(57600); Serial.println("Levitator by JSyA"); Serial.println("Starting..."); // задание режимов работы цифровых контактов pinMode(digPin, OUTPUT); pinMode(subPin, INPUT_PULLUP); pinMode(addPin, INPUT_PULLUP); // Levitator initialization End; Serial.println("Started."); } //---------------------------------------------------------| void loop() { //датчик Холла считывает напряженность магнитного поля anaVal = analogRead(anaPin); // увеличиваем значение точки левитации if (digitalRead(addPin) == LOW) { levVal++; value_log(); delay(250); } // уменьшаем значение точки левитации if (digitalRead(subPin) == LOW) { levVal--; value_log(); delay(250); } // проверяем точку левитации if (anaVal < levVal) { digVal = LOW; } else // if (anaVal > levVal) { digVal = HIGH; } // // включаем/выключаем электромагнит // на основе значения датчика и точки левитации digitalWrite(digPin, digVal); delayMicroseconds(dlyVal); } //---------------------------------------------------------| void value_log() // Analogic/Digital/Levitation Values Print; { // показываем значение датчика Холла Serial.print("anaVal=["); Serial.print(anaVal); Serial.print("]-"); // показываем состояние электромагнита On=1/Off=0; Serial.print("digVal=["); Serial.print(digVal); Serial.print("]-"); // показываем значение точки левитации Serial.print("levVal=["); Serial.print(levVal); Serial.println("];"); } //=========================================================| |
Код программы с PID контроллером
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
//=========================================================| // Ekobots Innovation Ltda - www.ekobots.com.br | // Juan Sirgado y Antico - www.jsya.com.br | //---------------------------------------------------------| // Program Magnetic Levitator PID - 2016/10/06 | // All rights reserved 2016 | //=========================================================| int anaPin = 1; // Arduino Analogic Pin 1 int digPin = 5; // Arduino Digital Pin 5 int subPin = 7; // Arduino Digital Pin 7 int addPin = 8; // Arduino Digital Pin 8 // int anaVal = 0; // Analogic Valie int digVal = 0; // Digital Value // int levVal = 262; // значение левитации int dlyVal = 10; // значение задержки // float timVal = 0; // значение времени //---------------------------------------------------------| // значения PID float setpoint = 0; float measured_value = 0; float output = 0; float integral = 0; float derivative = 0; float error = 0; float previous_error = 0; float dt = 0.1; float Kp = 1.0; float Ki = 0.1; float Kd = 0.01; //---------------------------------------------------------| void setup() { // инициализация левитатора; Serial.begin(57600); Serial.println("Levitator by JSyA"); Serial.println("Starting..."); // задание режима работы цифровых контактов pinMode(digPin, OUTPUT); pinMode(addPin, INPUT_PULLUP); pinMode(subPin, INPUT_PULLUP); // timVal = millis(); setpoint = levVal; // Levitator initialization End; Serial.println("Started."); } //---------------------------------------------------------| void loop() // PID { // считывание с датчика Холла напряженности магнитного поля anaVal = analogRead(anaPin); // вычисления по PID алгоритму measured_value = anaVal; error = setpoint - measured_value; integral = integral + error * dt; derivative = (error - previous_error) / dt; output = (-Kp * error) + (-Ki * integral) + (-Kd * derivative); previous_error = error; // Final value setup digVal += output; // проверяем значение точки левитации if (digVal < 0) digVal=0; if (digVal > 255) digVal=255; // увеличиваем/уменьшаем значение для электромагнита // на основе значения датчика и точки левитации analogWrite(digPin, digVal); // показываем значения лога для целей отладки // if((millis()-timVal) > 500) // { // value_log(); // timVal = millis(); // } // увеличиваем значение точки левитации if (digitalRead(addPin) == LOW) { setpoint++; value_log(); delay(250); } if (digitalRead(subPin) == LOW) { setpoint--; value_log(); delay(250); } // время между изменениями состояния электромагнита delayMicroseconds(dlyVal); } //---------------------------------------------------------| void value_log() // Analogic/Digital/Levitation Values Print; { // показываем значение датчика Холла Serial.print("anaVal=["); Serial.print(anaVal); Serial.print("]-"); // показываем состояние электромагнита On=1/Off=0; Serial.print("digVal=["); Serial.print(digVal); Serial.print("]-"); // показываем значение точки левитации Serial.print("setpoint=["); Serial.print(setpoint); Serial.println("];"); } //=========================================================| |