電磁石を使ってオブジェを作りました。完成させることが目的だったので全体的に簡易的です。
原理
ホールセンサで磁石と電磁石の距離を測定し、それに応じて電磁石を操作することで磁石を空中に維持します。
主な材料
・磁石:ネオジウム磁石…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を調節し安定する場所を探します。
根気です。
結果
動作の様子を動画で示します。
安定する場所を見つけることができれば、このように多少の刺激を与えても浮き続けます。
投稿者の人気記事
-
dono
さんが
2021/02/28
に
編集
をしました。
(メッセージ: 初版)
-
dono
さんが
2021/02/28
に
編集
をしました。
ログインしてコメントを投稿する