投稿

モンテカルロ法を使って円周率を求め続けるプログラムを作った

イメージ
こんにちは、こんばんは ある日、パソコンに負荷を与えたくなったのでこの記事を作りました。 円周率ってなんぞ? wiki 見てください。 いきさつ 手持無沙汰なパソコンが一つあって、リソースがもったいないなーと思っていました。 分かりやすくてマシンへの負荷が多くて面白い計算はないかなと考えていたところ、円周率の計算が思い当たりました。 負荷を与えるという点ではビュフォンの針でもよかったのですが、グラフでは表しづらく円と円周率の関係をわかりやすく表示できるものはないかなと考えて、モンテカルロ法を採用しました。 モンテカルロ法とは モンテカルロ法は円の公式に対してランダムな点を適当にとり、検証回数と当選回数(円の中に点が入った回数)の割合を求める方法です。 利点 ・計算がとても簡単 欠点 ・真の値を求めるために膨大な計算回数が必要 ・計算回数が多すぎて時間がかかりすぎる ・乱数のランダム性で結果が変わる 式 以下の式で求められます まず円の公式は \begin{align} (x-a)^2+(y-a)^2=r^2 \end{align} で表せられます。 そして原点に円を設定するとaは0になるので \begin{align} x^2+y^2=r^2 \end{align}  また半径は1に設定するとr=1になり \begin{align} x^2+y^2=1^2 \end{align} これを円の内側だけに入った点だけ取る条件式にすると \begin{align} \sqrt{x^2+y^2}<1 \end{align}  すべての円があって、そこに横縦それぞれ2ずつの正四角形があったとき、以下の図のようなイメージになります  その四角形の中に入るようにランダムに点を打っていったときに 円に入った点の数をNin、円に入らなかった点をNoutとします そうすると円周率は \begin{align} π=\frac{Nin}{Nout} \end{align}  効率的な円周率の計算方法 天才たちは日々、効率化をしています。よって円周率の求め方も効率...

Arduinoで電流を測定する

イメージ
こんにちは、こんばんは 今回はArduinoを使って電流を測定してみたいと思います。   用意するもの ・Arduino Uno ・ジャンパ線 ・1~250Ω、1W以上の抵抗(ニクロム線でも可) ・適当な電気負荷(抵抗、モーター等) ・5V以上の外部電源(あったらよい) 理論 どうやって電流を電圧に変更するのかというと、中学校で習う理論を使います。 それは抵抗によって起きる電圧降下を利用します。 下の図を見てください。 図の抵抗ではRvarとRconstが存在します。 ここでいうRvarは通常の負荷と考えてください。電気負荷は電気の使用量によって変化するので、Rvarの抵抗値は変数(自由に変わる数)であり、未知数なので計算には使用できません。 また、Rconstは変更されることのない抵抗なので、定数(変わることのない数)であり値は変化しません。 よってオームの法則を使うことによって電流がわかります。 \begin{align} R=\frac{V}{I} \end{align} そして回路を流れる電流はキルヒホッフの法則によりすべて同じです。 電流を計算するためにV0とV1の部分の差を取ります。 差をとる処理はオペアンプでも可能です。 また差をとって電流を調べるためには以下の式になります。 \begin{align} I[A]=\frac{V_0-V_1}{R_{const}} \end{align} また電力を求めるには電圧を掛けるだけなので、V0を掛けてやると以下の式になります。 \begin{align} E[W]=V_0\times\frac{V_0-V_1}{R_{const}} \end{align} 回路図 Rconstの抵抗に、100Ω10Wのセラミック抵抗を使用していますが、流す電圧と相談してワット数と抵抗の大きさを決めてください。 \begin{align} E_R[W]=\frac{V_{in}^2}{R_{const}} \end{align} Rvarは何らかの負荷を接続してください。また負荷が大きい場合(200mAを超える)はArduinoが壊れ...

サーボモーターをArduino、ESP32で制御する。

イメージ
こんにちは、こんばんは サーボモーターは知っていますか? モーターにパルス信号を送ると決まった角度だけ回転できるという優れたモーターです。 今回はその使い方を解説します。 用意するもの ・Arduino、ESP32どっちか ・サーボモーター(SG-90) ・ジャンパ線 ほかに用意するものとしてサーボモーターのライブラリを持ってきます。 Pulse関数を使って書いてもいいですが面倒なのでライブラリに頼ります。 https://github.com/RoboticsBrno/ServoESP32   サーボモーターについて サーボモーターにはACとDCタイプが存在します。  交流と直流で使えるかどうかだけの違いなのであまり詳しくは解説しませんが、トルクの特性の違いがあります。 また似たようなモーターでステッピングモーターがありますがこれに関しては動作原理が全く違います。 サーボモーターはロータリーエンコーダを用いてフィードバックをしますが、ステッピングモーターはフィードバックは行わず、コイルに流す電流の違いで角度を変化させます。 そのためステッピングモーターを扱うときは専用のモータードライバが必要になります。   DCタイプ 小さいタイプ   ACタイプ 大きいタイプ   回路 Arduinoでサーボモーターを扱うときは以下のようになります。 まず、外部電源を使うときの図です。 なぜ外部電源を使うのかというと、消費電力の大きいサーボモーターを使うとarduinoのボードを破損してしまう恐れがあるからです。またサーボモーターの電圧が足りず、サーボモーターがうまく回転しないときがあるので、そういったときは外部電源を使用します。   次にarduinoの内部電源を使うときの図です。  さらっと9番ピンを使っていますが、プログラムを変更すればどこでも使えるのでそこまで重要じゃないです。   ...

モータードライバL298Nを使う。

イメージ
こんにちは、こんばんは モータードライバをarduinoで使っていきたいと思います。    必要な部品  ・Arduino Uno  ・モータードライバー(L298N)  ・モーター(DC0~12Vの間までで駆動するもの) ・外部電源(DC0~12Vまで)  ・ジャンパ線とミノムシクリップ、ワニ口クリップ  部品の解説 このブログを書くにあたってL298Nのブログを調べました。 fritzingで分かりやすく解説しているブログがあまりなかった印象だったのでfriztingの図を使っていきたいと思います。 そしてここではL298Nのモジュールの解説をします。  手っ取り早くスペックを知りたい人はデータシートを読んでください。 https://www.akizukidenshi.com/download/ds/st/l298n.pdf   まず下の図がL298Nのモジュールの図になります。 そして図の下にある表がピンアサイン(ピンの役割と配置)になります。 ピン名 入力/出力 ことがら OUT1 出力 モーターAの出力 OUT2 出力 モーターAの出力 ...

Arduinoで超音波センサーを使う。(ESP32対応)

イメージ
 こんにちは、こんばんは Arduinoと超音波距離センサーを使ってArduinoで距離を測ってみたいと思います。 必要なもの ・Arduino、またはESP32 ・超音波センサー(HC-SR04) ・オスメスのジャンパ線 ・ブレッドボード  あれば ・温湿度計(DHT11) ・i2c搭載のLCD20x4,16x2 回路 Arduino ESP32 プログラム LCD20x4,16x2を使わない場合はシリアル通信で行います Arduino&ESP32 #define ECHO_PIN 2 // Echo Pin #define TRIG_PIN 3 // Trigger Pin #define SOUND_SPEED 340 //[m/s] #define MAX_WAIT 20000   double rate = 0; //受信間隔 double distance = 0; //距離 void setup() { Serial.begin(115200); pinMode(ECHO_PIN, INPUT); pinMode(TRIG_PIN, OUTPUT); } void loop(){   digitalWrite(TRIG_PIN, LOW);   delayMicroseconds(2);   digitalWrite(TRIG_PIN, HIGH); //超音波を出力   delayMicroseconds(10);   digitalWrite(TRIG_PIN, LOW);   rate = pulseIn(ECHO_PIN, HIGH, MAX_WAIT); //センサからの入力 if(rate > 0){     rate = rate/2;     distance = rate*SOUND_SPEED/1000000;     Serial.print("Distance:");  ...

Arduinoで初めての電子工作する。(Lチカ)

イメージ
こんにちは、こんばんは この記事ではLチカを行うだけです。 電子工作初めての人向けにちょっとだけ電気のルールを書いてあります。 必要なもの ・LED(定格5V)  ・Arduino Uno(またはNano、Mega) ・抵抗器100Ω 1kΩ(どちらかだけでもok) ・ブレットボード 回路を作る    これが回路になります。3番ピンから出て、抵抗を通って、LEDを通ってGNDに行くように電気が流れます。 電気は電圧が高いところから低いところに流れます。GNDは回路の電圧の基準であり、これを0Vとして考えます。そして回路のすべての電圧はGNDを基点の値として考えます。 プログラム Lチカ(LEDチカチカ)のプログラムは以下のようになります。 #define LED 3 //LEDの接続されているピン #define WAIT 1000 //待ち時間(ms) void setup(){ pinMode(LED, OUTPUT); //出力モードに設定する } void loop(){ digitalWrite(LED, HIGH); //5Vに設定する delay(WAIT); //待つ digitalWrite(LED, LOW); //0Vに設定する delay(WAIT); //待つ } 発展プログラム LチカにPWMを使います。 PWMはPulse Width Modulationの略で一定期間ごとのパルス電圧をパルス当たりの電圧の流す時間を変えて、電圧を疑似的に変えるという制御方法です。    ArduinoでPWMは簡単にできます。 #define LED 3 //LEDの接続されているピン #define WAIT 10 //待ち時間(ms)   void setup(){ pinMode(LED, OUTPUT); //出力モードに設定する } void loop(){ for(int i = 0; i < 256; i++){ //だんだん明るくなる analogWrite(LED, i); //PWM delay...

Arduino IDEを入れよう

 こんにちは、こんばんは 教育用マイコンボードであるArduino。 そのエディター兼コンパイラであるArduinoIDEを入れましょう。 思ったより簡単だと思いますよ。   Arduino IDEをダウンロードする まずArduino IDEをArduino.ccからダウンロードしてきます。 https://www.arduino.cc/ 上の「HARDWARE」「SOFTWARE」「CLOUD」と並んでいるので、「SOFTWARE」をクリックしてDownloadsに行けるので、右のDownload Optionsから Windows Win 10 and newer, 64 bits をクリックして、寄付を求められますがJUST DOWNLOADを押してダウンロードします。寄付を払いたい人は払ってください。   Arduinoをインストール ダウンロードしたexeファイルをクリックしてウィザードに沿ってインストールします。 あとは設定でコンフィグをいじってください。   以上です。お疲れさまでした。

windows10にpythonを入れる&使えるようにする

イメージ
どうもこんにちは pythonを最近勉強しているのですがいちいちubuntuのPCを起動させるのが面倒くさい... じゃあwindowsで開発環境作ればいいじゃん。 なので作ります 作ってみる 私はVScodeが好きなのでこれを使います。自分の好きなエディターを使ってください ↓↓VScode↓↓ https://code.visualstudio.com/ windowsの64bit版を拾ってきます。 次にpythonを拾ってきます。 ↓↓python↓↓ https://www.python.org/ pythonは好きなバージョンで入れればいいと思います。 ちなみに私は最新バージョンでやります。 「Downloads」から「All released」をクリック 下のほうに行くと「Looking for a specific release?」と書いてあるとこがあるのでそこの一番上のバージョンの「Download」をクリックするとわけわからんページにページに飛びますが下のほうまで行くと「Files」という項目があるのでそこの「Windows x86-64 executable installer」をクリックしてダウンロードします。 ※注意点1 pythonの最新バージョンだとwindowsでうまくpathが通らないことがあるためもしうまくいかないようならバージョンを一つ古いのに下げてやってみてください。 ※注意点2 pythonのバージョンは2.xと3.xだとだいぶ仕様だったりが変わっていて古いライブラリが動かないことがあります。使用するライブラリ等のバージョンにあったものを拾ってきましょう。 pythonをインストールします。 pythonのインストーラをダブルクリックで起動させます...

マイコンを知ろう(マイコンボードの種類とか)

イメージ
 こんにちは、こんばんは マイコンボードって知っていますか? 1970年代に誕生し、今では300円程度で買えるようになったマイコンボードですが、本記事ではその種類をざっくり解説していこうと思います。 ちなみにマイコンと言っていますがオンボードのマシンとごっちゃにして言っています。 大体あってて知ったかぶりできる程度の知識しか書いていないので、もっと詳しく知りたかったらググるなり図書館に行くなりして自分で調べてください。 (テンプレ)    PC(プログラマブルコントローラー) マイコンと呼べるかは怪しいですが(少なくとの一枚の基板からはできていない)一応元祖の存在として書いておきます。PCはGM(ゼネラルモーターズ)で開発されました。キーボードを使ってプログラムを書き込み、ピンにリレーをつないで回路を制御します。今でも産業の現場では使われています。   Arduino(アルドゥイーノ) イタリアで教育用途として開発されたマイコンです。非常に簡単に操作できるようになっており、回路も単純(マイコンボードを使う場合)なので誰でもちょっと勉強するだけで使えます。またICの許容電流量が比較的大きいため壊すリスクが低いです。また専用の書き込みソフトがあり本当に誰でも使えます。さすが教育用   PIC(ピック) PICはマイクロ・テクノロジー社によって開発されました。こちらはArduinoよりも本格的というか、玄人向けです。それ以外は比較的Arduinoと似ています。   Raspberry PI(ラズベリーパイ) Raspberry PI、通称ラズパイはパソコンとしても使えるマイコンです。32、64bit可能なRaspberry PI A, B, Zeroタイプは内部にLinuxというOSをインストールできます。LinuxはWindowsとかMacOSみたいなもんですね(本当は全然違うけど)。なかでもRaspberry PI NanoはOSは入れられませんがとっても小さくて安価で買えます。しかもPythonというプログラムを使えます。一応教育用としての活用が多いラズパイですが普通にいろいろなことができるので知りたかったら調べてください。ここで書くには多すぎる。   ESP32 ESP8266 ESP32 ESP...

インターネットの通信方法を知ろう(TCP、UDP通信)

イメージ
こんにちは、こんばんは 今回はインターネットの通信で使われるTCPとUDPについてだいぶザックリ解説します。 大体あってて知ったかぶりできる程度の知識しか書いていないので、もっと詳しく知りたかったらググるなり図書館に行くなりして自分で調べてください。 TCP TCPは Transmission Control Protocolの略です。日本語では伝送制御プロトコルと言われています。 TCPはUDPよりも速度を遅くなっており、信頼性に重きを置いた通信方法となっていて、送信した側が受信側にちゃんと情報が届いたのか確認できる強みがあります。 なので認証が必要な通信、また相手に届いているか知る必要がある通信にはTCPを使います。  同期型です。 UDP UDPはUser Datagram Protocolの略です。 UDPはTCPより早く通信できるようになっていますが、通信が相手に問題なく届いているのかを確認することができません。ですがTCPよりも早く送信できるためネットゲームの通信や、ストリーミングサービスなど通信量がとにかく多いサービスで使われます。 非同期型です。 イメージ図 わかりやすい図があったので張り付けておきます。      http://itpro.nikkeibp.co.jp/atcl/column/16/042500095/042500005/?ST=spleaf