つくったブログ

ぼくがつくったもの。

ただ素数を数えあげる回路、プッチ神父回路をつくった。

https://www.instagram.com/p/BASzrs3LLon/

生きていればピンチな状況に陥ることもある。人によっては落ち着く方法を持っている。彼らは独自のルーティンによって呼吸を整え、思考をクリアにすることができる。エンリコ=プッチは素数を数える。

落ち着け……心を平静にして考えるんだ…こんな時どうするか……
2… 3 5… 7… 11… 13… 17… 19
落ち着くんだ… 『素数』を数えて落ち着くんだ…
『素数』は1と自分の数でしか割ることができない孤独な数字……私に勇気を与えてくれる

私も素数を数えたいがなかなか覚えられない。ということで素数を表示させる回路をつくり、落ち着くことにした。

必要なもの

品名 金額 個数
ダイナミック接続4桁青色7セグLED([OSL40562-LB) ¥250 1個
220Ω抵抗 ¥100(100個入り) 8個
ブレッドボード・ジャンパーワイヤ EIC-J-L ¥400(1パック) 1個
ブレッドボード・ジャンパーコード(オス-オス)(10cm) ¥180(1セット) 1セット

抵抗はLEDが光れば良いので、適当なものを使おう。ジャンパワイヤーも繋がればいいので、既に持っていれば新たに買う必要はない。

つなぎかた

写真で紹介。

https://www.instagram.com/p/BAVPMvLrLpu/

  • 数字の小数点が手前側に来るように、7セグLEDを設置する。
  • 220Ω抵抗を写真のようにつなげる。
  • 7セグLEDの六本足の左側と一番左の抵抗の位置を揃えること。六本足の右端はまだ接続しない。

https://www.instagram.com/p/BAVPGHkrLpi/
こうなる。

https://www.instagram.com/p/BAVO-uBrLpH/

  • 六本足の右側からジャンパワイヤーを伸ばし、写真のように接続する。

https://www.instagram.com/p/BAVO2omrLo7/

  • 今度は上側。左から二番目の足からジャンパワイヤーをぐるりと伸ばし、一番右の抵抗に接続する。

https://www.instagram.com/p/BAVOui9LLon/

  • 右隣も同様にぐるりと伸ばし、右から二番目の抵抗に接続する。

https://www.instagram.com/p/BAVOhKwrLn3/

  • 一番右の足もぐるり。

https://www.instagram.com/p/BAVMdMSrLjR/

  • 最後に曲がるジャンパワイヤーを写真のように接続する。

完成。


接続の状態を表にまとめた。足の番号はこのように割り振る。

https://www.instagram.com/p/BAVV7X7rLqE/

足の番号 接続状態
1 -220Ω-8番pin
2 -220Ω-7番pin
3 -220Ω-6番pin
4 -220Ω-5番pin
5 -220Ω-4番pin
6 -9番pin
7 -3番pin
8 -10番pin
9 -11番pin
10 -2番pin
11 -1番pin
12 -12番pin

プログラム

//参考 LED site:(http://happy-arduino.blogspot.jp/2012/08/17_27.html)
//ブッチ神父回路
#include <MsTimer2.h>   // タイマー割り込みを利用する為に必要なヘッダファイル
const int led_1  = 9;  // 7segLED the one's place 
const int led_10 = 10;  // 7segLED the ten's place 
const int led_100  = 11;  
const int led_1000 = 12; 

int state = 2;          // LEDの状態(0ならオフ、1ならオン)
int state_1=2;          // the one's digit 
int state_10 =0;        // the ten's digit
int state_100 =0;        
int state_1000 =0;    
int j=2;

void setup(){
  //1~8番ピン デジタル出力へセット
  for (int i=1; i<=8; i++){
    pinMode(i,OUTPUT);
  }
 
  pinMode(led_10, OUTPUT); // 7segLED はoutput
  pinMode(led_1, OUTPUT);
  pinMode(led_100, OUTPUT); 
  pinMode(led_1000, OUTPUT);
  
  MsTimer2::set(1000, count_up);     // 1000ms毎に割込み関数を呼び出す様に設定
  MsTimer2::start();             // タイマー割り込み開始
}

//LEDレイアウトを定義
boolean Num_Array[11][8]={
  {1,1,1,0,1,0,1,1},{0,0,1,0,1,0,0,0},{1,0,1,1,0,0,1,1},{1,0,1,1,1,0,1,0},
  {0,1,1,1,1,0,0,0},{1,1,0,1,1,0,1,0},{1,1,0,1,1,0,1,1},{1,1,1,0,1,0,0,0},
  {1,1,1,1,1,0,1,1},{1,1,1,1,1,0,1,0},{0,0,0,0,1,0,0}
};
//LED表示関数を定義

void NumPrint(int Number){
  for (int w=0; w<=7; w++){
  digitalWrite(w+1,Num_Array[Number][w]);
  }
}
void count_up(){
state=state+1;
while(state!=j){
  while(state % j !=0){
    j=j+1;
  }
  if(state==j){
    j=2;
    break;
  }
  state=state+1;
  j=2;
}
   state = state % 10000;
   state_1 = state % 10; 
   state_10 = state /10 % 10;
   state_100 = state /100 % 10;
   state_1000 = state /1000 % 10;
}

void loop(){
   digitalWrite(led_1000,1);
   digitalWrite(led_100,1);
   digitalWrite(led_10,1);
   digitalWrite(led_1,0);
   NumPrint(state_1);
   delay(3);
   digitalWrite(led_1000,1);
   digitalWrite(led_100,1);
   digitalWrite(led_10,0);
   digitalWrite(led_1,1);
   NumPrint(state_10);
   delay(3);
   digitalWrite(led_1000,1);
   digitalWrite(led_100,0);
   digitalWrite(led_10,1);
   digitalWrite(led_1,1);
   NumPrint(state_100);
   delay(3);
   digitalWrite(led_1000,0);
   digitalWrite(led_100,1);
   digitalWrite(led_10,1);
   digitalWrite(led_1,1);
   NumPrint(state_1000);
   delay(3);
}
  • タイマー割り込みを使い、1秒ごとに素数を数えるようにプログラムしている。
  • NumPrint()という関数を使い、一桁の整数を飛ばせば数字通りにLEDが光るようになっている。
  • 桁数の指定はdigitalWriteのON/OFFを使う。一桁ごとにLEDを点灯させている。delay(3)の数字を大きくするとそれがわかる。
  • 素数を求めるプログラムはcout_up()のところ。もう少し速く計算させたい。

うごきます。


#arduino

またくだらないものをつくってしまった。