編集履歴一覧に戻る
donoのアイコン画像

dono が 2021年02月28日19時23分03秒 に編集

初版

タイトルの変更

+

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

タグの変更

+

秋葉原2021

+

PIC

メイン画像の変更

メイン画像が設定されました

本文の変更

+

電磁石を使ってオブジェを作りました。完成させることが目的だったので全体的に簡易的です。 # 原理 ホールセンサで磁石と電磁石の距離を測定し、それに応じて電磁石を操作することで磁石を空中に維持します。 ![キャプションを入力できます](https://camo.elchika.com/4988f8bd7fc35b755d2ce9baf9e9c0dd38dcfd0e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61346135616538632d636364302d343562392d626263372d3334383832386466663632362f65336233303732662d383033312d343835322d626562392d383361363736613536346434/) # 主な材料 ・磁石:ネオジウム磁石…100円ショップのものを使用しました。 ・ボルト:M6(鉄製)…電磁石の鉄心に使います。 ・エナメル線:約10m…電磁石の巻線に使います。10mより長くても大丈夫です。 ・ホール素子:A1324LUA-T…磁石と電磁石の距離を測るために使用します。リニア出力のものを使用してください。 ・Hブリッジ回路:それなりに電流を流せるもの…電磁石を動作させるために使います。正負電源が用意できる環境であればTブリッジでも大丈夫です。 ・マイコン:PIC16F1827…Arduinoでも良いと思います。 # ハードウェア ハードウェアの概略図を示します。 ホール素子とボリュームから出力される電圧をマイコンで比較し、電磁石の極性を変化させます。 電磁石の直流抵抗が小さいため、許容電流の小さなHブリッジ回路を使うと過電流で素子が燃える可能性があります。作る際は気を付けてください。 ![キャプションを入力できます](https://camo.elchika.com/980d30351ba203c191a57b0bcb7fef83d5274435/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61346135616538632d636364302d343562392d626263372d3334383832386466663632362f36646237663865622d383762332d343061662d383537622d643736656665343138383061/) # 作り方 ネジにエナメル線を巻き付け、端を銅線に繋ぎます。(写真のものは線が外れないようにエポキシで固めています) ![キャプションを入力できます](https://camo.elchika.com/c880212d2967e7805102d15e432dd8291e559eca/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61346135616538632d636364302d343562392d626263372d3334383832386466663632362f39303434623761302d373234392d343838382d383130362d313239353065306638616337/) 次にホール素子の各足に銅線を繋ぎます。 ![キャプションを入力できます](https://camo.elchika.com/6fa61c6f60bf601ac8046cd62298a50b1510c247/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61346135616538632d636364302d343562392d626263372d3334383832386466663632362f65326535373935302d393432342d343533652d623131392d323163616538623465336534/) 電磁石の先端にホール素子が来るように固定します。 ![キャプションを入力できます](https://camo.elchika.com/afbd309f26b20e6aae08c91a18f67333caefec8a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61346135616538632d636364302d343562392d626263372d3334383832386466663632362f64383965636639392d646332652d343361662d623864332d373966336139333436376665/) 電磁石を固定するためのフレームを作り、そこに取り付けます。(楽しい工作シリーズのユニバーサルプレートを使用しました) ![キャプションを入力できます](https://camo.elchika.com/3effe6051ac1971e59ff1f4a375a1d51bcace086/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f61346135616538632d636364302d343562392d626263372d3334383832386466663632362f64373732346236312d633861642d343931652d613538352d643231366263383531303736/) ホール素子をマイコン、電磁石をHブリッジ回路に接続すれば完成です。 浮かべる方は、**軽く**(浮きやすい)**大きく**(動きが遅くなるため安定しやすい)**重心が磁石から離れている**(近いとひっくり返る)ものが良いので、今回はプラスチックのケースを使用しました。 # ソフトウェア 使用したプログラムを示します。 ```arduino: // 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を調節し安定する場所を探します。 根気です。 # 結果 動作の様子を動画で示します。 @[youtube](https://youtu.be/Wo3gOOnWsUQ) 安定する場所を見つけることができれば、このように多少の刺激を与えても浮き続けます。