ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

Posts Tagged ‘Arduino UNO

Windows XP で Arduino IDE 1.8.2 をインストールして ESP8266 Community ボードパッケージを適用し、nodeMCU Amica にスケッチを書きこもうとするとエラーがおこる – bits フォルダに cxxabi_tweaks.h ライブラリを配置すると解消する。

leave a comment »

Windows XP Service Pack 2 のノートパソコンを使って Arduino の開発環境を整えようとしている。Arduino IDE はバージョン 1.8.2 を使い、インストールする。この状態で、オリジナルの Arduino UNO は開発することができ、また CH340 や CP210 の USB シリアル変換ドライバを適用すれば Arduino UNO のクローンも開発することができる。しかし、ボードマネージャを使って ESP8266 ボードパッケージをインストールしても、nodeMCU Amica や nodeMCU LoLin にスケッチを書きこもうとするとエラーが出て書き込めない。

Arduino_1.8.2_setup_004

このときのエラーは、以下のようなものになっている。

—————————————————————————————-

Arduino:1.8.2 (Windows XP), ボード:"NodeMCU 1.0 (ESP-12E Module), 80 MHz, 115200, 4M (3M SPIFFS)"

In file included from C:\Documents and Settings\user\Local Settings\Application Data\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\abi.cpp:23:0:

c:\documents and settings\user\local settings\application data\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\cxxabi.h:50:32: fatal error: bits/cxxabi_tweaks.h: No such file or directory

#include <bits/cxxabi_tweaks.h>

                                ^

compilation terminated.

exit status 1
ボードNodeMCU 1.0 (ESP-12E Module)に対するコンパイル時にエラーが発生しました。

「ファイル」メニューの「環境設定」から
「より詳細な情報を表示する:コンパイル」を有効にすると
より詳しい情報が表示されます。

—————————————————————————————-

このエラーからは、必要なライブラリがないことでコンパイルエラーになっていることがわかる。実際にフォルダを開くと、確かに必要なライブラリがない。

Arduino_1.8.2_setup_005

そこで、この「bits」フォルダに「cxxabi_tweaks.h」ライブラリをコピーする。「cxxabi_tweaks.h」ライブラリは、GitHub などから入手する。

Arduino_1.8.2_setup_006

Arduino_1.8.2_setup_007

Arduino IDE を再起動し、Blink のスケッチを書きこむとうまくいった。

Arduino_1.8.2_setup_002

Arduino_1.8.2_setup_008

広告

Written by Yoshio Matsumoto

2017年6月14日 at 10:50 AM

今週末は神戸三ノ宮でアドミンティーチャーズのラボワーク。ArduinoでWebサービスをプログラミング。

leave a comment »

今週末は連休の後半だが、5月7日(土)に神戸三ノ宮でアドミンティーチャーズのラボワーク第4会をやる。今回のテーマは「Webサービス」だ。使うのは WIZnet の TCP/IP ハードウェア処理チップ W5100 を使った Arduino UNO 用の定番イーサネットシールドだ。

アドミンティーチャーズ「ラボワーク LW04 – W5100イーサネットシールドを使ったWebサービスのプログラミング」
https://adminteachers.wordpress.com/2016/04/18/%e3%83%a9%e3%83%9c%e3%83%af%e3%83%bc%e3%82%af-lw04-w5100%e3%82%a4%e3%83%bc%e3%82%b5%e3%83%8d%e3%83%83%e3%83%88%e3%82%b7%e3%83%bc%e3%83%ab%e3%83%89%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9fweb/

p1140109_clip_640_480

Arduino には、このイーサネットシールドを使って TCP/IP 通信をするライブラリが提供されている。このライブラリを利用すると簡単に TCP/IP 通信をするプログラムを作ることができる。Web サービスのサンプルコードも提供されており、簡単に Web サーバーを作ることができる。

Web サーバーを作るだけでなく、プログラム上で TCP/IP 通信のデータを見ると、Web サービスでどんなデータがやりとりされているかがわかる。すると単に決まった固定の HTML テキストを返すだけでなく、I/O ポートから受け取ったデータを返すことや、POST メソッドで受け取ったデータをどう処理すればいいかが理論的に理解できる。

このように今回の実習では、単に実用的な Web サービスを作るだけでなく、HTTP 通信の中身を明らかにすることもラボワークの目的とする。まさに「ラボ」という言葉にぴったりの時間にするように企画している。

神戸三ノ宮で開催したアドミンティーチャーズの「ラボワーク LW03 – マルチファンクションシールドを使ったシフトレジスタとダイナミック点灯のプログラミング」

leave a comment »

「ラボワーク」と題してこの 2月から兵庫県神戸市中央区、JR三ノ宮駅近くの会議室を借りて勉強会をやっている。今回は 3回目で、実験用のマルチファンクションシールドを使ったプログラミンを体験した。

マルチファンクションシールドは Arduino UNO 用に作られた実験用シールドで、昔の言い方では「ドーターボード」と呼ばれる一種の拡張ボードだ。Arduino UNO のI/Oピンにあわせて作られているが、必要なピンだけジャンパケーブルでつなげば他のマイコンボードでも使える。

P1140072_mid_640_480

このマルチファンクションボードには 4つの 7セグメント LED チューブ、3つのボタン、4つの LED、ブザー、ポテンショメーター(ボリューム)がついている。これらの部品をマイコンボードでテストしようと思えばブレッドボードで回路を組んでもいいのだが、このように基盤に取り付けられていると簡単に実験できる。ラボワークではマルチファンクションシールドと Arduino UNO、Digispark などを人数分用意した。

P1130534_mid_640_480

Arduino UNO でマルチファンクションシールドを使うには、そのまま上に載せればいい。

P1130543_mid_640_480

Arduino UNO を使う場合は上に載せるだけだが、Digispark で使う場合は次のように 5本のジャンパワイヤーで接続する。3本はデータ送信用、2本は電源供給用だ。

P1140074_mid_640_480

P1130536_mid_640_480

Digispark は前回のラボワークではオンボードの LED をコントロールしただけだったので加工の必要がなかったが、今回のようにジャンパワイヤーで I/O を接続するには I/O ピンをはんだ付けしなければならない。I/O ピンがついていない Digispark のためにはんだごてを用意した。

P1130538_mid_640_480

プログラミングは各自のコンピュータで Arduino IDE を使って行った。プリントを用意してサンプルコードを簡単なものから実用的なものまで用意して体験した。

P1130546_mid_640_480

マルチファンクションシールドには 4つの 7セグメント LEDチューブが載っている。この LEDチューブはシフトレジスタ 74HC595を介して接続されている。74HC595は汎用シフトレジスタで、3本のコントロール信号でシリアル信号を8ビットのパラレル信号に変換することができる。マルチファンクションシールドにはこの 74HC595が 2つ搭載されており、ひとつは 7セグメントの形を決め、もうひとつは出力する LEDを決める。

シフトレジスタの使い方とダイナミック点灯の概念を理解するサンプルコードを用意し、LEDチューブの形と点灯させるチューブの選択、ビットパターンの関係を表にしてイメージできるようにプリントを用意した。

P1130548_mid_640_480

P1130542_mid_640_480

「ラボワーク」は毎月第一土曜日の夜やっている。次回は 5月7日(土)の夜、19:00から。詳細は「アドミンティーチャーズ」の Webで。

100 円均一ショップで買った乾電池チェッカーで Netduino 2 と Arduino UNO の PWM パルス幅変調アナログ出力をチェックする

leave a comment »

100 円均一ショップには電子工作で使えそうなものがたくさんある。電子パーツとして買うとそれなりに値段がするものが手軽に手に入る。100 円均一ショップで売っていたアナログメーター式の乾電池チェッカーを使って Netduino 2 と Arduino UNO の PWM パルス幅変調アナログ出力をチェックする実験をしてみた。

Netduino 2 や Arduino UNO のアナログ出力は PWM パルス幅変調 Pulse Width Modulation であり、実際に出力電圧が変化しているのではない。5V の電圧を出力するにあたってパルスを使い、パルス幅の 5V と 0V の比を変化させることで平均電圧、という表現は正確ではないかもしれないが、疑似的に電圧を変化させるのと同等の効果を得ているのだ。ちなみに Arduino Due には D/A 変換回路が組み込まれており、本物のアナログ出力を行うことができるようだ。

P1110829_clip_640_480

まず本体を分解する。ニッパーとペンチで角から。分解すると内部はアナログメーターと 4 本の抵抗で構成されていることがわかる。はんだごてではんだを溶かしてばらばらにする。

P1110830_mid_640_480

P1110831_clip_640_480

念のため元の回路とテスターで測った抵抗の実測値をメモしておく。

P1110832_mid_640_480

このアナログメーターで、5V の出力値を MAX で表示できるようにすればいい。そこでいくらの抵抗をつなげばよいかをボリュームで調節して決める。ボリュームの値は 800 オームから 1k オームにすればよいことがわかった。

P1110833_mid_640_480

手元に適当な値の抵抗がなかったので、510 オームの抵抗を 2本直列につなぎ、1.02 kオームにして使うことにした。回路はとりあえず空中配線で。

P1110834_mid_640_480

Netduino 2 で PWM によるアナログ出力をするには、C# では次のようなコードになる。パルス幅を連続的に変化し、フェードイン、フェードアウトの効果を得る出力だ。

———————————————————————————

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

namespace Netduino_Analog_Out_Blink
{
    public class Program
    {
        public static void Main()
        {
            PWM myPWM = new PWM(SecretLabs.NETMF.Hardware.Netduino.PWMChannels.PWM_PIN_D9,100,0,false);
            double myAdd = 0.001;

            myPWM.Start();

            while(true)
            {
                myPWM.DutyCycle = myPWM.DutyCycle + myAdd;
                Thread.Sleep(2);

                if(myPWM.DutyCycle > 0.999)
                {
                    myAdd = myAdd * (-1);
                }
                if(myPWM.DutyCycle < 0.001)
                {
                    myAdd = myAdd * (-1);
                }
            }
        }
    }
}

———————————————————————————

これを電池チェッカーのメーターで受け取ると、メーターの針がゆっくりと右へ左へ振れることがわかる。

P1110837_mid_640_480

Arduino UNO で PWM によるアナログ出力をするには、次のようなスケッチになる。

———————————————————————————

int bri = 0;
int myAdd = 5;

void setup()
{
  pinMode(9, OUTPUT);
}

void loop()
{
  analogWrite(9, bri);

  bri = bri + myAdd;

  if (bri == 0 || bri == 255)
  {
    myAdd = myAdd * (-1);
  }
  delay(40);
}

———————————————————————————

P1110835_mid_640_480

Arduino UNO と XBee で双方向無線通信のテストをする。Microsoft Visual Studio Express 2012 によるC#プログラミングでデータをWindowsフォームから送受信する。

leave a comment »

Arduino に XBee を載せ、PC 側から USB 接続した XBee でデータを送受信するテストをした。この無線化 Arduino に対して Windows Form からデータを送受信してみよう。

Arduino UNO と XBee で双方向無線通信のテストをする。
https://matsumotoyoshio.wordpress.com/2014/01/18/arduino-uno-%e3%81%a8-xbee-%e3%81%a7%e5%8f%8c%e6%96%b9%e5%90%91%e7%84%a1%e7%b7%9a%e9%80%9a%e4%bf%a1%e3%81%ae%e3%83%86%e3%82%b9%e3%83%88%e3%82%92%e3%81%99%e3%82%8b%e3%80%82/

XBee で無線接続化された Arduino に対して Windows Form からデータを送受信するプログラムを C# で作るとどうなるだろうか。Arduino は XBee で無線化されているが、要はシリアル通信を行えばよい。Microsoft Visual Studio Express 2012 で C# の新しいプロジェクトを作り、Windows Form を開発しよう。

プロジェクトができたら、まずシリアル通信をするために System.IO.Ports 名前空間の記述をする。

————————————————————————————

using System.IO.Ports;

————————————————————————————

そしてシリアルポートのインスタンスを生成し、初期化をする。

————————————————————————————

SerialPort mySiPo = new SerialPort("COM4");

・・・・・・・・・・・・

mySiPo.BaudRate = 9600;
mySiPo.Open();

————————————————————————————

そしてデータを受け取ったときのイベントハンドラを作成する。

————————————————————————————

mySiPo.DataReceived += mySiPo_DataReceived;

————————————————————————————

mySiPo_DataReceived イベントハンドラに、受け取ったデータをメッセージボックスで表示するコードを書く。

————————————————————————————

MessageBox.Show(mySiPo.ReadLine());

————————————————————————————

ここまででデータ受信の準備ができた。最後にデータを送信するためのボタンをフォーム上に3つつくり、それぞれのボタンにデータ「1」、「0」、「-1」を送信する役割をさせる。ボタンのラベルを書き換え、ボタンのクリックイベントハンドラにそれぞれ次の記述をする。

————————————————————————————

mySiPo.Write("1");

・・・・・・・・・・・・・・・・・

mySiPo.Write("0");

・・・・・・・・・・・・・・・・・

mySiPo.Write("-1");

————————————————————————————

ここまででコード全体はこのようになる。

————————————————————————————

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace Arduino_Serial_Control_001
{
    public partial class Form1 : Form
    {
        SerialPort mySiPo = new SerialPort("COM4");
        public Form1()
        {
            InitializeComponent();
            mySiPo.BaudRate = 9600;
            mySiPo.Open();
            mySiPo.DataReceived += mySiPo_DataReceived;
        }

        void mySiPo_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            MessageBox.Show(mySiPo.ReadLine());
        }

        private void button1_Click(object sender, EventArgs e)
        {
            mySiPo.Write("1");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            mySiPo.Write("0");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            mySiPo.Write("-1");
        }
    }
}

————————————————————————————

Form のデザインは次のとおりだ。

Arduino_XBee_双方向通信_004_mid_640

<Fig.1 : Microsoft Visual Studio Express 2012 のデザイン画面>

ビルドしフォームを開き、ボタンをクリックしてデータを送信する。データが送られると、無線により XBee を介して Arduino に送信され、受け取ったデータを判断してテキストが返ってくる。

Arduino_XBee_双方向通信_005

<Fig.2 : 完成した Windows Form>

Arduino_XBee_双方向通信_008

<Fig.3 : ボタンをクリックするとデータが送信され、Arduino が判断して結果のテキストを返す>

Written by Yoshio Matsumoto

2014年1月18日 at 3:58 PM

Arduino UNO と XBee で双方向無線通信のテストをする。

with one comment

Arduino に XBee を取り付けると、シリアル通信を無線化することができる。シリアル通信は双方向に送受信できるので、PC側から XBee によってデータを送り、Arduino で受け取ったデータを判断して結果を返す、という実験をする。

Arduino と XBee はあらかじめ設定しておく。通信の対になる XBee も設定しておき、通信できる状態にする。一方の XBee は XBee Wireless プロトシールドで Arduino に載せ、もう一方の XBee はXBee USB アダプターで PC に接続する。

Arduino_XBee_双方向通信_003_IMG_6553_mid_640_480

<Fig.1 : XBee を載せた Arduino と USB アダプターで PC に接続した XBee>

Arduino のスケッチは次のようなものだ。シリアルポートから受け取ったデータを数値に変え、値が正か負かゼロかを判断している。受け取った値が正なら「It is bigger than 0」、値が負なら「It is smaller than 0」、値がゼロなら「It is the same as 0」の文字列を送る。

————————————————————————————

int i = 1;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  while (Serial.available() > 0) {
    int i = Serial.parseInt();
    if (i > 0) {
      Serial.print("It is bigger than 0");
      Serial.print("\n");
      }
    if (i < 0) {
      Serial.print("It is smaller than 0");
      Serial.print("\n");
    }
    if (i == 0) {
      Serial.print("It is the same as 0");
      Serial.print("\n");
    }
  }
}

————————————————————————————

Arduino_XBee_双方向通信_002

<Fig.2 : 双方向通信をテストするArduinoのスケッチ>

スケッチを Arduino に書き込んだら PC から切り離して XBee Wireless プロトシールドで XBee を載せ、別電源を使って USB に給電して動かす。次に PC に XBee を載せた XBee USB アダプターを接続し、XBee でシリアル通信を行う。シリアル通信には X-CTU を使ってみる。

X-CTU を起動したら Terminal タブを開き、シリアル通信を行う。正の数や負の数、ゼロを送信し、正しい結果が返ってくることを確かめる。Arduino を PC から離し、どの程度の距離まで通信するか、障害物があれば通信が途絶えるか、などを確かめる。

Arduino_XBee_双方向通信_001

<Fig.3 : X-CTU を使った XBee 無線シリアル通信のテスト>

Written by Yoshio Matsumoto

2014年1月18日 at 2:30 PM

Arduino UNOをWindows 7に接続しVisual Studio 2010 Expressを使ってC#でプログラミングし制御する – その2 – 光センサの値をArduinoで読みとりシリアルポートでPCに送信する

with one comment

ArduinoはUSBインタフェースをもっており、PCで作った「スケッチ」と呼ぶプログラムをArduinoにアップロードするために使われるが、このUSBインターフェースを介してArduinoとPCの間でデータ通信をさせることもできる。このとき、物理的にはUSBインタフェースを使うが、プログラム上はシリアル通信でデータを送受信する。なぜUSBでシリアル通信ができるかといえば、ArduinoにはシリアルコンバーターATmega8U2が組み込まれており、一方PC側にはArduino用のシリアルUSBドライバをインストールしてあるからである。

コンピュータのコントロールパネルから「デバイスマネージャ―」を開き「ポート」を展開すると「Arduino UNO R3 (COM3)」ドライバがあるのがわかる。そしてドライバのプロパティを開き「ポートの設定」をみると、シリアル通信の定義がわかる。またここで「詳細設定」のボタンをクリックすれば「COMポート番号」を変更することができる。

Arduino_002_Serial_001_mid_640

<Fig.1 : デバイスマネージャでArduino UNO R3ドライバを確認する>

Arduino_002_Serial_002

<Fig.2 : Arduino UNO R3ドライバのプロパティでポートの設定を確認する>

まずArduinoとPCでシリアル通信のテストをしてみよう。Arduinoには一定の間隔でデータをシリアルポートに送信するスケッチを書き、実行する。PC側ではシリアル通信のデータを受け取るコンソールアプリケーションを作る。

Arduinoのスケッチは次のようになる。一定の間隔で変数iをカウントアップし、シリアルポートに送信するものだ。

Arduino_002_Serial_003

<Fig.3 : シリアルポートからカウントアップした値を連続出力するスケッチ>

次にVisual Studioでシリアルポートからデータを受信するコンソールアプリケーションを作る。System.IO.Ports名前空間を追加しておくことを忘れずに。

————————————————————————————

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;

namespace Arduino_001_Com_Read
{
    class Program
    {
        static bool running = true;
        static void Main(string[] args)
        {
            SerialPort mySerialPort = new SerialPort("COM3");
            mySerialPort.BaudRate = 9600;
            mySerialPort.Open();
            while (running)
            {
                string myData = mySerialPort.ReadLine();
                Console.WriteLine(myData);
            }
        }
    }
}

————————————————————————————

Arduinoに作ったスケッチを書き込んでおく。スケッチを書き込むとArduinoはシリアルポートに対して数字をカウントアップしながらデータを出力し始める。一方PCではシリアルデータを受け取るコンソールアプリケーションをビルドし起動する。するとコンソールにArduinoから数字データが連続して受信されることが確認できる。これでArduinoからPCにシリアルデータが送受信できたことが確かめられた。

Arduino_002_Serial_004_mid_640

<Fig.4 : コンソールアプリケーションでArduinoからシリアルポートに送信される数字データを受信する>

ではArduinoに光センサを取り付け、センサの値を読み取ってシリアルポートに送信してみよう。光センサとArduinoの接続はブレッドボードを使うといいだろう。Arduinoのアナログ入力はA0を使うこととし、ピンA0を光センサの一方の端子に接続する。次の写真では緑色のジャンパワイヤを使っている。光センサのもう一方の端子はArduinoの5V出力に接続する。写真では赤色のジャンパワイヤだ。ArduinoのピンA0に接続した光センサの端子には、10kΩの抵抗をつけ、ArduinoのGNDへ接続する。

Arduino_002_Serial_005_circuit_2_mid_640

<Fig.5 : Arduinoと光センサ、抵抗の接続図>

先に作ったArduinoのテスト用スケッチをスケッチを次のように変更する。シリアルポートに出力するiの値をアナログI/OのA0から取得し、改行する。Serial.print()の第2引数「DEC」は出力フォーマットを10進数にするという意味だ。また値を取得する間隔を一定程度あけるため、delay(1000)を書いている。delayの単位はミリ秒なので、delay(1000)は1秒だ。

Arduino_002_Serial_006

<Fig.6 : Arduinoで光センサの出力をシリアルポートに送信するスケッチ>

Arduinoにスケッチを書きこんだら、シリアルポートに光センサの値を出力しはじめる。Visual Studioで作ったシリアルポートの値を取得するコンソールアプリケーションは最初に作ったテスト用のものでいい。コンソールアプリケーションを起動すると次のように光センサの出力を受信しはじめる。光センサを手で覆ったり、部屋の明かりを強くしたりしてセンサの出力が変わることを確かめよう。

Arduino_002_Serial_007_mid_640

<Fig.7 : Arduinoから光センサの出力を受け取るコンソールアプリケーション>

Arduinoはスタンドアロン型のマイコンボードだが、このようにセンサの値ををシリアル出力にするインタフェースとして使うこともできる。光センサを温度センサや距離センサに置き換えると、温度や距離をPCで受け取ることもできる。Arduinoで各種センサを使う方法はいくつかの書籍で紹介されており、Webでも公開されている。Arduinoとブレッドボードを使えば、はんだ付けをする必要なくセンサの実験ができる。教科「情報」でセンサの実習に使うこともできるだろう。

●関連記事

「Arduino UNOをWindows 7に接続しVisual Studio 2010 Expressを使ってC#でプログラミングし制御する – その1 – シリアルポートで文字を送信しLEDをON、OFFする」
https://matsumotoyoshio.wordpress.com/2013/02/03/arduino-uno%e3%82%92windows-7%e3%81%ab%e6%8e%a5%e7%b6%9a%e3%81%97visual-studio-2012-express-for-windows-desktop%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6c%e3%81%a7%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9/