Arduinoによる磁気浮上
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
Arduinoを搭載したレビテーター。
ボディを3Dプリントすることもできません。
https://www.thingiverse.com/thing:1392023
- 印刷と取り付けが簡単です(接着剤を少し使用するだけで、ネジは不要です)。
- ファームウェア(Levitator.ino)をarduinoボードにインストールするだけです。
- ファームウェアをインストールした後は、12V電源だけで、コンピューターは必要ありません。
- スイッチを使用して永久磁石の位置を調整します。
- arduinoシリアルモニターを使用して、正しい値を確認してください。
- おもちゃに正しい値をハードコーディングできます。
プロトボードを使用することも、ボードを作成することもできます(Arduino Nano)。
http://www.thingiverse.com/thing:1392530
<図>または、1つ購入するだけです:
https://oshpark.com/shared_projects/kxH3Ak1b
<図>注意:
- ホールセンサーをチップの下部に配置します(top_sensor.stl)画像を参照してください;
- 正しく機能するには、ホール効果センサーが電磁気から少なくとも5mm離れている必要があります。
- 他のリニアホールセンサーを使用できます (ホールセンサースイッチは使用しないでください );
- ネオジム永久磁石を使用 (一般的な磁石では機能しません);
- 重いオブジェクトはより安定しています。
詳細とヒントについては、Thingiverseの私のメイクを参照してください。
Levitator 3Dプリント:
https://www.thingiverse.com/make:201394
Arduino Nanoのシールド:
https://www.thingiverse.com/make:201420
それは簡単です。
コード
- Levitator.ino
- Levitator_PID.ino
Levitator.ino Arduino
Arduinoを使用した磁気浮上玩具のコード。Easy(No PID)
// =========================================================| // Ekobots Innovation Ltda-www.ekobots.com.br | // Juan Sirgado y Antico-www.jsya.com.br | //- -------------------------------------------------- ------ | //プログラムMagneticLevitator-2016 / 02/06 | // All rights reserved 2016 | // =========================================================| int anaPin =1; // Arduinoアナロジックピン1; int digPin =5; // Arduinoデジタルピン5; int subPin =7; // Arduinoデジタルピン7; int addPin =8; // Arduinoデジタルピン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; //遅延値マイクロ秒; // ----------------------------------------- ---------------- | void setup(){//レビテーターの初期化開始; Serial.begin(57600); Serial.println( "Levitator by JSyA"); Serial.println( "開始中..."); //デジタルピンの作業モードの設定; pinMode(digPin、OUTPUT); pinMode(subPin、INPUT_PULLUP); pinMode(addPin、INPUT_PULLUP); //レビテーターの初期化終了; 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(anaVallevVal){digVal =HIGH; } ////電磁石のオン/オフを切り替えます。 //センサー値と浮上点に基づいて; digitalWrite(digPin、digVal); delayMicroseconds(dlyVal);} // ------------------------------------------ --------------- | void value_log()//アナロジック/デジタル/レビテーション値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( "];");} // =========================================================|
Levitator_PID.ino Arduino
Arduinoを使用した磁気浮上玩具のコード。ハード(PIDバージョン)
// =========================================================| // Ekobots Innovation Ltda-www.ekobots.com.br | // Juan Sirgado y Antico-www.jsya.com.br | //- -------------------------------------------------- ------ | //プログラムMagneticLevitator PID-2016 / 10/06 | // All rights reserved 2016 | // =========================================================| int anaPin =1; // Arduinoアナロジックピン1intdigPin =5; // Arduinoデジタルピン5intsubPin =7; // Arduinoデジタルピン7intaddPin =8; // Arduinoデジタルピン8 // int anaVal =0; //アナロジックValieintdigVal =0; //デジタル値// intlevVal =262; // Levitation Valueint dlyVal =10; //遅延値// float timVal =0; //時間値// -------------------------------------------- ------------- | // PID値フロート設定値=0;フロート測定値=0;フロート出力=0;フロート積分=0;フロート導関数=0;フロートエラー=0;フロート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( "開始中..."); //デジタルピンの作業モードの設定; pinMode(digPin、OUTPUT); pinMode(addPin、INPUT_PULLUP); pinMode(subPin、INPUT_PULLUP); // timVal =millis(); setpoint =levVal; //レビテーターの初期化終了; Serial.println( "Started。");} // ------------------------------------- -------------------- | void loop()// PID {//ホールセンサーの読み取り(磁場の強さ); anaVal =analogRead(anaPin); // PID計算measured_value =anaVal;エラー=設定値-測定値;積分=積分+エラー* dt;導関数=(エラー-previous_error)/ dt;出力=(-Kp *エラー)+(-Ki *積分)+(-Kd *導関数); previous_error =エラー; //最終値の設定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()//アナロジック/デジタル/レビテーション値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( "];");} // =========================================================|
回路図
フリッツィングIDE 製造プロセス