donoのアイコン画像
dono 2021年02月28日作成 (2021年02月28日更新)
製作品 製作品 閲覧数 2305
dono 2021年02月28日作成 (2021年02月28日更新) 製作品 製作品 閲覧数 2305

半日で作る磁気浮遊オブジェ

電磁石を使ってオブジェを作りました。完成させることが目的だったので全体的に簡易的です。

原理

ホールセンサで磁石と電磁石の距離を測定し、それに応じて電磁石を操作することで磁石を空中に維持します。
キャプションを入力できます

主な材料

・磁石:ネオジウム磁石…100円ショップのものを使用しました。
・ボルト:M6(鉄製)…電磁石の鉄心に使います。
・エナメル線:約10m…電磁石の巻線に使います。10mより長くても大丈夫です。
・ホール素子:A1324LUA-T…磁石と電磁石の距離を測るために使用します。リニア出力のものを使用してください。
・Hブリッジ回路:それなりに電流を流せるもの…電磁石を動作させるために使います。正負電源が用意できる環境であればTブリッジでも大丈夫です。
・マイコン:PIC16F1827…Arduinoでも良いと思います。

ハードウェア

ハードウェアの概略図を示します。
ホール素子とボリュームから出力される電圧をマイコンで比較し、電磁石の極性を変化させます。
電磁石の直流抵抗が小さいため、許容電流の小さなHブリッジ回路を使うと過電流で素子が燃える可能性があります。作る際は気を付けてください。
キャプションを入力できます

作り方

ネジにエナメル線を巻き付け、端を銅線に繋ぎます。(写真のものは線が外れないようにエポキシで固めています)
キャプションを入力できます
次にホール素子の各足に銅線を繋ぎます。
キャプションを入力できます
電磁石の先端にホール素子が来るように固定します。
キャプションを入力できます
電磁石を固定するためのフレームを作り、そこに取り付けます。(楽しい工作シリーズのユニバーサルプレートを使用しました)
キャプションを入力できます
ホール素子をマイコン、電磁石をHブリッジ回路に接続すれば完成です。

浮かべる方は、軽く(浮きやすい)大きく(動きが遅くなるため安定しやすい)重心が磁石から離れている(近いとひっくり返る)ものが良いので、今回はプラスチックのケースを使用しました。

ソフトウェア

使用したプログラムを示します。

// PIC16F1827 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = ON // PLL Enable (4x PLL enabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), high trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) #include <xc.h> #define _XTAL_FREQ 16000000 #define MD1 LATAbits.LATA2//Hブリッジ回路の一方に接続されている端子 #define MD2 LATAbits.LATA3//Hブリッジ回路の一方に接続されている端子 #define LED1 LATBbits.LATB1//状態出力用LED(無くても動作はします) #define LED2 LATBbits.LATB2//状態出力用LED(無くても動作はします) #define LED3 LATBbits.LATB3//状態出力用LED(無くても動作はします) #define volpin 1//浮遊の高さを調節する為のボリュームを接続している端子 #define magpin 0//ホール素子が接続されている端子 #define space 15//高さの遊び void PICinit(void); unsigned short ADSTART(char ch); void SwitchMg(unsigned char A,unsigned char B); void SwitchLED(unsigned char led1,unsigned char led2,unsigned char led3); void main(){ __delay_ms(10); PICinit(); signed short mem; signed short vol; signed short mg; while(1){ if(mem++>3000){//一定間隔でボリュームの値を取得 mem=0; vol=ADSTART(volpin); } SwitchMg(0,0);//電磁石の磁束が測定に影響するため、AD変換中は電磁石はOFF mg=ADSTART(magpin); //↓この部分で電磁石の操作を決定します if((vol+space)<=mg){ SwitchMg(1,0); SwitchLED(1,0,0); }else if((vol-space)>=mg){ SwitchMg(0,1); SwitchLED(0,0,1); }else{ SwitchLED(0,1,0); } __delay_us(900); } } void PICinit(void){ OSCCON =0b11111010; //IO OPTION_REG=0b00010010; LATA =0b00000000; TRISA =0b00000011; ANSELA =0b00000011; LATB =0b00000000; TRISB =0b00000000; ANSELB =0b00000000; WPUB =0b00000000; //ADC ADCON0 =0b00110000; ADCON1 =0b10100000; return; } unsigned short ADSTART(char ch){ ADCON0bits.ADON=1; ADCON0bits.CHS=(ch); __delay_us(5); ADCON0bits.GO_nDONE=1; while( ADCON0bits.GO_nDONE ); ADCON0bits.ADON=0; return ((ADRESH<<8)|(ADRESL)); } void SwitchMg(unsigned char A,unsigned char B){ if((A==MD1)&&(B==MD2)) return; if((MD1!=0&&MD2!=0)){ MD1=0; MD2=0; __delay_us(10); } if((A==1)&&(B==0)){ MD1=1; MD2=0; }else if((A==0)&&(B==1)){ MD1=0; MD2=1; }else{ MD1=0; MD2=0; } return; } void SwitchLED(unsigned char led1,unsigned char led2,unsigned char led3){ LED1=led1; LED2=led2; LED3=led3; return; }

調節

ボリュームと、プログラム中のspaceを調節し安定する場所を探します。
根気です。

結果

動作の様子を動画で示します。

ここに動画が表示されます

安定する場所を見つけることができれば、このように多少の刺激を与えても浮き続けます。

4
ログインしてコメントを投稿する