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

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

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

原理

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

主な材料

・磁石:ネオジウム磁石…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
ログインしてコメントを投稿する