Arduino Nano磁気浮上プロジェクト:パーツと配線ガイド
部品と用品
| Arduino Nano R3 | ×1 | どのArduinoでも使用可能ですが、シールドはNano用に設計されています |
| 電磁石 12V 25mm径 | ×1 | |
| リニアホール効果センサー 49E | ×1 | ホール効果スイッチは使用不可 |
| ダーリントン高出力トランジスタ | ×1 | TIP 120 |
| 抵抗 1kΩ | ×1 | |
| 1N4007 - 高耐圧・大電流ダイオード | ×1 | |
| 電源 12V 1A | ×1 | |
| ブレッドボード(汎用) | ×1 | |
| SparkFun Pushbutton switch 12mm | ×2 | |
| ジャンパーワイヤー(汎用) | ×1 |
アプリとオンラインサービス
- Arduino IDE
このプロジェクトについて
Arduinoによる磁気浮上装置。
ボディを3Dプリントしても、しなくても構いません。
https://www.thingiverse.com/thing:1392023
- プリントと取り付けが簡単(接着剤のみ、ネジ不要)
- ファームウェア(Levitator.ino)をArduinoボードにインストールするだけ
- ファームウェアインストール後はコンピューター不要、12V電源のみで動作
- スイッチで永久磁石の位置を調整
- Arduinoシリアルモニターで正しい値を確認
- 正しい値を玩具にハードコード可能
ユニバーサル基板でも、自作基板(Arduino Nano用)でも使用可能。
https://www.thingiverse.com/thing:1392530

または購入も可能:
https://oshpark.com/shared_projects/kxH3Ak1b

注意事項:
- ホールセンサーを先端の底部(top_sensor.stl)に配置してください。画像参照
- 正しく動作させるには、ホール効果センサーは電磁石から少なくとも5mm離す必要があります
- 他のリニアホールセンサーも使用可能(ホールセンサースイッチは不可)
- ネオジウム永久磁石を使用してください(普通の磁石では動作しません)
- 重い物体の方が安定します

詳細とヒントはThingiverseの私の作品を参照してください。
3Dプリントされた磁気浮上装置:
https://www.thingiverse.com/make:201394
Arduino Nano用シールド:
https://www.thingiverse.com/make:201420
それだけです。
コード
Levitator.ino Arduino
Arduinoによる磁気浮上おもちゃのコード。簡易版(PIDなし)
//=========================================================| // 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 Poit Value; int dlyVal = 250; // Delay Value Micro Seconds; //---------------------------------------------------------| void setup() { // Levitator initialization Begin; Serial.begin(57600); Serial.println("Levitator by JSyA"); Serial.println("Starting..."); // Digital Pins Work Mode Setup; pinMode(digPin, OUTPUT); pinMode(subPin, INPUT_PULLUP); pinMode(addPin, INPUT_PULLUP); // Levitator initialization End; Serial.println("Started."); } //---------------------------------------------------------| void loop() { // Hall Sensor Read (Magnetic Field Intensity); anaVal = analogRead(anaPin); // Increase The Value Of Levitation Point; if (digitalRead(addPin) == LOW) { levVal++; value_log(); delay(250); } // Decrease The Value Of Levitation Point; if (digitalRead(subPin) == LOW) { levVal--; value_log(); delay(250); } // Check the Levitation Point; if (anaVal < levVal) { digVal = LOW; } else // if (anaVal > levVal) { digVal = HIGH; } // // Turn ON/OFF The Electromagnet; // With Base on Sensor Value and the Levitation Point; digitalWrite(digPin, digVal); delayMicroseconds(dlyVal); } //---------------------------------------------------------| void value_log() // Analogic/Digital/Levitation Values Print; { // Show the Hall Sensor Value; Serial.print("anaVal=["); Serial.print(anaVal); Serial.print("]-"); // Show the Electromagnet state On=1/Off=0; Serial.print("digVal=["); Serial.print(digVal); Serial.print("]-"); // Show the Levitation Point Value; Serial.print("levVal=["); Serial.print(levVal); Serial.println("];"); } //=========================================================|
Levitator_PID.ino Arduino
Arduinoによる磁気浮上おもちゃのコード。PID制御版(上級)
//=========================================================| // 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; // Levitation Value int dlyVal = 10; // Delay Value // float timVal = 0; // Time Value //---------------------------------------------------------| // PID Values 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() { // Levitator initialization Begin; Serial.begin(57600); Serial.println("Levitator by JSyA"); Serial.println("Starting..."); // Digital Pins Work Mode Setup; pinMode(digPin, OUTPUT); pinMode(addPin, INPUT_PULLUP); pinMode(subPin, INPUT_PULLUP); // timVal = millis(); setpoint = levVal; // Levitator initialization End; Serial.println("Started."); } //---------------------------------------------------------| void loop() // PID { // Hall Sensor Read (Magnetic Field Intensity); anaVal = analogRead(anaPin); // PID calculations 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; // Check the value for levitation point; if (digVal < 0) digVal=0; if (digVal > 255) digVal=255; // Increase/Decrease the value for Electromagnet; // With Base on Sensor Value and the Levitation Point; analogWrite(digPin, digVal); // Show log values for debug; // if((millis()-timVal) > 500) // { // value_log(); // timVal = millis(); // } // Increase The Value Of Levitation Point; if (digitalRead(addPin) == LOW) { setpoint++; value_log(); delay(250); } if (digitalRead(subPin) == LOW) { setpoint--; value_log(); delay(250); } // Time between electromagnet state changes; delayMicroseconds(dlyVal); } //---------------------------------------------------------| void value_log() // Analogic/Digital/Levitation Values Print; { // Show the Hall Sensor Value; Serial.print("anaVal=["); Serial.print(anaVal); Serial.print("]-"); // Show the Electromagnet state On=1/Off=0; Serial.print("digVal=["); Serial.print(digVal); Serial.print("]-"); // Show the Levitation Point Value; Serial.print("setpoint=["); Serial.print(setpoint); Serial.println("];"); } //=========================================================|
回路図
Fritzing IDE
製造プロセス
- Arduinoで作るレトロNumitron管時計:シンプル、信頼性高く、省エネ
- K30 CO2センサで室内空気質をリアルタイム監視する
- 1SheeldとArduinoで盲ろう者のコミュニケーションを支援する
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- Arduino MegaとNextion HMIで作る高機能ウェザーステーション
- Arduinoベースのヌンチャク操作6自由度ロボットアームキット
- Arduinoで作る斥力式磁気浮上装置: シンプル回路とDIYガイド
- Arduino UNOとEthernetシールドで太陽放射を測定する自作ピラノメーター
- コンパクトなArduinoレーダーシステム – HC-SR04超音波センサー & 1.8インチST7735ディスプレイ搭載