Arduino

07/07/2019

Tact buttonを押した回数をLED Matrix display 8×8 dots (MAX7219) に表示する

Tact-sw-counter-with-8x8-dot-matrix-dispImg_20190707_125127Img_20190707_132210 タクトボタンを押した回数を、LED Matrix display 8×8 dots に表示させたいと思い作ってみた。
表示器は、8×8 dotsが1つなので、数値は「9」迄しか表示できない。ただし、表示させてみたところ、DOSのマニュアルにあるコードページ437 が使われているので、タクトスイッチを47クリックしてようやく「0」になる。それでカウンターに初期値「48(=0)」を入れ、タクトスイッチが押される毎に、コードを進めて、カウント文字を表示することにした。
int icount = 48;
となっているのは、このためであり、Matrix display に「0」と表示させるための小技である。
従って、タクトボタンを押す回数が進めば、表示は数字ではなく、コード表にある文字に変わってゆく。
いまのところ、これを使う表示では、数値が2桁になることは無いだろうと思っているが、カウント数が増えれば、表示方法も考える必要がある。

部品は下記のとおり。
① LED Matrix display 8×8 dots ・・・ amazon で 購入 @257
② Arduino NANO ・・・ amazon で 購入
③ tact button
④ 単線cable

1)LED Matrix display 8×8 dots は、私がブレッドボードに取り付けたい方向にピン差し込み部分が無いので、
ピンの曲がりをラジオペンチで直して、半田ごてを使ってピンの半田を溶かしながら、素早くスライドさせて、ブレッドボードに差し込めるようにした。
ブレッドボード上の配線は、ブレッドボードに這わせるように引いたので、線の繋がりが見えにくいかもしれない。

Matrix display の各端子とArduinoのピンとの接続は下記のように行った。

Matrix Display    Arduino NANO
VCC ・・・・・・・・・ 5V
GND ・・・・・・・・・ GND
DIN ・・・・・・・・・ D11
CS  ・・・・・・・・・ D10
CLK ・・・・・・・・・ D13

Tact Switch
左下pin ・・・・・・・ D7
左上pin ・・・・・・・ GND

2)タクトボタンを押すと、チャタリングが入ってしまい、数値が順に表示されなくなるので、
 gazettelabo「●arduino(アルディーノ) 押しボタンスイッチ」を参考にさせて戴き、チャタリング対策を行った。

3) 表示をリセットするには、Arduino NANO の中央部にある「RESET」を押せば、再起動して、表示もゼロからカウントするので、それで良しとした。

その他、ディスプレイ表示では、データが文字(character)でないとダメなので、カウントしている数値(numeric)を文字に変換する方法で手間取った。ようやく文字に変えたつもりが、表示された文字は、ASCIIのIBMコードになっている! それで、数値を示すコードに変更するために、カウント値に 48を加える必要があった。


《sketch》


// http://euc.jp/i18n/charcode.ja.html for character code
// http://gazettelabo.seesaa.net/article/447403643.html
// Reset should be push on reset button on Arduino NANO
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
const int numberOfHorizontalDisplays = 1;
const int numberOfVerticalDisplays = 1;
const int pinCS = 10; // Cs - SS (Pin 10)
// Din - Mosi (Pin 11)
// Clk - Sck (Pin 13)
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
const int wait = 50;
const int count = 7;
int icount = 48;
char c;

void setup() {
matrix.setIntensity( 1 ) ; // Adjust the brightness between 0 and 15
matrix.setPosition( 0, 3, 0) ;
matrix.setRotation( 0, 3) ; // rotation position
Serial.begin(9600);
pinMode(count, INPUT_PULLUP);
matrix.fillScreen(LOW);
c = char(icount);
matrix.drawChar( 2, 1, c, HIGH, LOW, 1);
matrix.write();
}

void loop() {
if ( digitalRead ( count ) == 1)
icount = icount + 1 ;
while ( digitalRead ( count ) == 1) {
delay (wait);
}
c = char(icount);
Serial.print("icount ");
Serial.print(icount);
Serial.print(" = ");
Serial.println(c);

matrix.drawChar( 2, 1, c, HIGH, LOW, 1);
matrix.write(); // Send bitmap to display
delay(wait);
}



06/18/2019

Arduinoでトイレの電気消し忘れ注意喚起

  Photo時々、トイレの電気を消し忘れている事がある。PIRでモーション検知して電灯をON/OFFする方法もあるが、利用中に突然電灯が消えるという可能性もある。
トイレの電灯を消し忘れた状態では、モーションが検知されず、室内は明るい状態にある。この時に注意喚起音を流せば、この音に気づいて、消灯するだろうと思い、Arduino NANO を使って、

簡単な回路を作ってみた。

システムのチェック用のために、LEDを2つ追加した。
左側は、PIRセンサーの動作確認用で、PIRセンサーがモーションを検知すると点灯する。右側のLEDは、電灯が消えている時に点灯する。
LEDに流れる電流が多くて、ブレッドボード基盤周りが少し熱を持つので、適当な抵抗を入れて電流制限するのが良さそうだ。

必要なセンサーは、部屋の明るさ用にCDR、モーション検知用にPIRの2つ。どちらも手元にあったものを使った。

この状態で暫く使ってみて、動作が良くないようなら、Sketchの中の常数を少し変えてみよう・・・

半日後 ・・・ 状況検出がうまくいっていないので、主に Loop部の Sketchを下記のように書き直した。

ところが・・・使ってみると、夜間、トイレの電気を点灯すると、ブザーが鳴ってしまう! この警報はうるさいなぁ~これを回避しないと、実用とするのは如何なものか・・・ 悩ましい。

《Sketch》

#define LDRpin A0 // this LDR detect the brightness in the room
const int buzzPin = 9;
const int blight = 700; // the threshold value of brightness
int LDRValue = 0; // for read the LDR analog pin
int darkled = 12; // to check darkness
int pirled = 6; // to check motion detection
int pirsensor= 2; // PIR sensor pin
int pirval = 0;
int state = LOW;

void setup() {
Serial.begin(9600); // sets serial port for communication
pinMode(darkled, OUTPUT); // initalize LED as an output
pinMode( pirled, OUTPUT);
pinMode(pirsensor, INPUT); // initialize sensor as an input
pinMode(buzzPin, OUTPUT); // alarm
}

void loop() {
LDRValue = analogRead(LDRpin); // read the value from the LDR
Serial.print("LDR Value = ");
Serial.println(LDRValue); // print the value to the serial port
pirval = digitalRead(pirsensor); // read sensor value
if(LDRValue > blight )
{
digitalWrite(darkled, LOW);
if( pirval == LOW ) // the motion is not detected
{
digitalWrite(pirled, LOW);
// Makes pulses
for(int x = 0; x < 1000; x++) {
digitalWrite(buzzPin,HIGH);
delayMicroseconds(130);
digitalWrite(buzzPin,LOW);
delayMicroseconds(130);
}
delay(300);
}
if ( pirval == HIGH ) // human is in the room
{
digitalWrite(pirled, HIGH);
Serial.println("Motion detected!");
delay(30000);
}
}
if(LDRValue <= blight )
{
digitalWrite(darkled, HIGH);
}
state = LOW;
digitalWrite( pirled, LOW);
digitalWrite(buzzPin, LOW);
digitalWrite(darkled, LOW);
}

 

06/12/2019

4-8x8 dot matrix Clock drive by Arduino NANO and GPS

Gpsfritzing3
 4連 8x8 dot matrix LED の Lチカが上手くできたので、GPSを追加して時計を作ってみた。


 Fritzingを使った、8x8 dot matrix LED、GPS、Arduino  NANOの結線状態は、図のようである。

 LEDとGPSに関して、ここで使った部品の Fritzing 画像をネット上で探したが、見つからなかったので、類似部品を使って結線図を作成した。



私が使った部品
は、
・4連 8x8 dot matrix LED : SODIAL(R) 4イン1ドットマトリクスMCU LEDディスプレイモジュールDIYセット
                                       価格 @589 (Amazon から購入)
・GPS unit : GPS受信機キット 1PPS出力付き 「みちびき」3機受信対応 [AE-GYSFDMAXB]
                   価格 @2100(秋月電子通商から購入)
・Arduino NANO 

GPSユニットは、Fritzingで使ったような、価格の安価なものでも利用できるのではないかと思う。
図のように結線し、下記のSketchで稼働させればよい。クリックすれば、画像を拡 大できるブログエディタの機能がどこにあるのか分からない・・・(ココログの新エディタ、使いにくい!)

そのため、結線方法をここに記載しておく(Sketchの中にも記載しておいたが・・・)

Arduino NANO      GPS
D3  ------------------  TXD
D4  ------------------  RXD
GND  ----------------  GND
5V  ------------------  5V

Arduino NANO      Max7219
D10  -----------------  CS
D11  -----------------  DIN
D13  -----------------  CLK
GND  ----------------  GND
5V  ------------------  VCC

Sketchでちょっと苦労したのは、午前0時から9時までのように、1桁になってしまう時刻の表示。加えて、時計が稼働していることを示す方法。

・1桁になる時刻は、GPSから受け取った「時(hour)」の桁数を読んで、1桁の場合には、スペース(” ”)を入れ、表示させることにした。(一般的な処置方法は、10以上か否かという数値の処理で行われている。) 僕は、文字の桁数で処理することにして、「分(minute)」の方は、ゼロ(”0”)を入れて表示させるようにした。
 ただし、Serial.print で表示させる displayTime() のところは、引用した Sketch のまま変更していない。
 displayDate() についても、引用した Sketch のまま変更していない。
 ドットマトリックス表示には無関係なので、消してもよかったのだが、あとで Serial.print する際のことを考慮して残した。
・時計の稼働は、「時」と「分」の間の「:」を点滅させることで、動いていることを表示させるようにした。

《参考としたブログなど》
MAX7219 Arduino Clock  (instructables circuits より)



《Sketch》

// GPS Clock with MAX7219 8x8 display  2019/06/12  << My Spice Cabinet >>
#include <TinyGPS++.h> // Include the TinyGPS++ library
#include <SoftwareSerial.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
TinyGPSPlus tinyGPS;  // Create a TinyGPSPlus object
#define GPSBaud 9600 // GPS module baud rate. defaults to 9600
#define ARDUINO_GPS_RX 4 // GPS TX, Arduino RX pin
#define ARDUINO_GPS_TX 3 // GPS RX, Arduino TX pin
SoftwareSerial ssGPS(ARDUINO_GPS_TX, ARDUINO_GPS_RX);
#define gpsPort ssGPS // Alternatively, use Serial1 on the Leonardo
#define SerialMonitor Serial
const byte PIN_CLK = 13;   // define CLK pin (any digital pin)
const byte PIN_DIO = 11; // define DIO pin (any digital pin)
int pinCS = 10; // Attach CS to this pin, DIN to MOSI and CLK to SCK (cf http://arduino.cc/en/Reference/SPI )
int numberOfHorizontalDisplays = 4;
int numberOfVerticalDisplays = 1;
int wait = 70; // In milliseconds
int spacer = 1;
int Y0 = 0; // if Y0=0 then
int jpt;
int width = 5 + spacer; // The font width is 5 pixels
char time_value[20];
String s;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup()
{
gpsPort.begin(GPSBaud);
SerialMonitor.begin(115200);
matrix.setIntensity(10); // Use a value between 0 and 15 for brightness
matrix.setPosition( 0, 3, 0) ; // The first display is at <0, 0>
matrix.setPosition( 1, 2, 0) ; // The second display is at <1, 0>
matrix.setPosition( 2, 1, 0) ; // The third display is at <2, 0>
matrix.setPosition( 3, 0, 0) ; // The fourth display is at <3, 0>
matrix.setRotation(0, 1); // The first display is position upside down
matrix.setRotation(1, 1); // The first display is position upside down
matrix.setRotation(2, 1); // The first display is position upside down
matrix.setRotation(3, 1); // The first display is position upside down
delay(1000);
}
void loop()
{
// print position, altitude, speed, time/date, and satellites:
displayInfo();
// "Smart delay" looks for GPS data while the Arduino's not doing anything else
smartDelay(1000);
}
void displayInfo()
{
// Print latitude, longitude, altitude in feet, course, speed, date, time,
// and the number of visible satellites.
SerialMonitor.print("Lat: "); SerialMonitor.println(tinyGPS.location.lat(), 6);
SerialMonitor.print("Long: "); SerialMonitor.println(tinyGPS.location.lng(), 6);
SerialMonitor.print("Alt: "); SerialMonitor.println(tinyGPS.altitude.feet());
SerialMonitor.print("Course: "); SerialMonitor.println(tinyGPS.course.deg());
SerialMonitor.print("Speed: "); SerialMonitor.println(tinyGPS.speed.mph());
SerialMonitor.print("Date: "); displayDate();
SerialMonitor.print("Time: "); displayTime();
SerialMonitor.print("Sats: "); SerialMonitor.println(tinyGPS.satellites.value());
SerialMonitor.println();
jpt = tinyGPS.time.hour() + 9;
if( jpt >= 24 ) jpt = jpt - 24;
s=String(jpt);
if( s.length() == 1 )
{
s = " " + s;
time_value[0]= s.charAt(0);
time_value[1]= s.charAt(1);
}
else
{
time_value[0]= s.charAt(0);
time_value[1]= s.charAt(1);
}
s=String(tinyGPS.time.minute() );
if( s.length() == 1 )
{
s = "0" + s;
time_value[3]= s.charAt(0);
time_value[4]= s.charAt(1);
}
else
{
time_value[3]= s.charAt(0);
time_value[4]= s.charAt(1);
}
matrix.fillScreen(LOW);
matrix.drawChar( 2, Y0, time_value[0], HIGH,LOW,1);
matrix.drawChar( 8, Y0, time_value[1], HIGH,LOW,1);
// matrix.drawChar(14, Y0, 58, HIGH,LOW,1); // Fixed 58(ASCII Code) = ":"
matrix.drawChar(20, Y0, time_value[3], HIGH,LOW,1);
matrix.drawChar(26, Y0, time_value[4], HIGH,LOW,1);
matrix.write(); // Send bitmap to display
delay(1000);
matrix.drawChar(14,0, 58, HIGH,LOW,1); // blinking 58(ASCII Code) = ":"
matrix.write(); // Send bitmap to display
}
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
// If data has come in from the GPS module
while (gpsPort.available())
tinyGPS.encode(gpsPort.read()); // Send it to the encode function
// tinyGPS.encode(char) continues to "load" the tinGPS object with new
// data coming in from the GPS module. As full NMEA strings begin to come in
// the tinyGPS library will be able to start parsing them for pertinent info
} while (millis() - start < ms);
}
// printDate() formats the date into dd/mm/yy.
void displayDate()
{
SerialMonitor.print(tinyGPS.date.day());
SerialMonitor.print("/");
SerialMonitor.print(tinyGPS.date.month());
SerialMonitor.print("/");
SerialMonitor.println(tinyGPS.date.year());
}
// printTime() formats the time into "hh:mm:ss", and prints leading 0's
// where they're called for.
void displayTime()
{
SerialMonitor.print(tinyGPS.time.hour()+9);
SerialMonitor.print(":");

if (tinyGPS.time.minute() < 10) SerialMonitor.print('0');
SerialMonitor.print(tinyGPS.time.minute());
SerialMonitor.print(":");
if (tinyGPS.time.second() < 10) SerialMonitor.print('0');
SerialMonitor.println(tinyGPS.time.second());
}

06/11/2019

Arduino で 4-8x8 dotmatrix LED使用方法(いわゆるLチカ)

4-8x8ドットマトリックスLEDで時刻表示を行いたいが、私が理解しやすい方法がなかなか見つからなかった。
直接に時計表示では、何が問題でうまくできないのかが明確に分からないので、単純にLED表示だけを行って、やり方を確認することにした。

参考にしたのは「8×32 LED Matrix MAX7219 Tutorial with Scrolling Text」というブログ。ここでは、4つの8x8ドットLEDマトリックスに対して、設定した文字列を左右方向に流すもの。私は、まず固定表示で、表示方法を確認するのが目的なので、そこに書かれているスケッチから、私の目的に対し不要なものは削って、なるべく最小限のスケッチで、8x8ドットマトリックスの表示を使うには、どうすれば良いかを探ってみた。

下記のスケッチでは、文字列「23:56」を表示させるもので、使っているフォントの1文字の幅は5dotである。表示装置の横幅は、32dotあるので、「23:56」が形よく表示されるように、各文字の表示位置を下記のように少し修正している。

matrix.drawChar( 1, 0, string[0], HIGH, LOW, 1);
matrix.drawChar( 8, 0, string[1], HIGH, LOW, 1);
matrix.drawChar(13, 0, string[2], HIGH, LOW, 1);
matrix.drawChar(18, 0, string[3], HIGH, LOW, 1);
matrix.drawChar(25, 0, string[4], HIGH, LOW, 1);


左端に位置する「2」と、右端に表示する「6」の表示バランスを考え、左側には1列分、右側には2列分を空けることにした。
各文字のX方向の開始位置は、上記のスケッチのように 1,8,13,18,25 とした。そうすると、「2」「3」「:」「5」「6」の各文字の間には、それぞれ2ドット分の空きができる。

フォントの高さは7ドットなので、Y方向は「0」とした。その結果、表示の下の行には、無表示の部分ができる。
もし、文字の上部側に無表示のドットスペースを置くのなら、Y方向は「1」とすればよい。

注意しなければいけない事として、matrix.setPosition の書き方があるように思う。

matrix.setPosition( 0, 3, 0) ; // The first display is at <0, 0>
matrix.setPosition( 1, 2, 0) ; // The second display is at <1, 0>
matrix.setPosition( 2, 1, 0) ; // The third display is at <2, 0>
matrix.setPosition( 3, 0, 0) ; // The fourth display is at <3, 0>


ブログからサンプルとしたものでは、文字が乱れて、どのように並んでいるのか、良くわからない状態だった。
僕は表示させる文字列を「1234」として、表示がどのように並ぶかを確認してみた。
その結果、サンプルのものでは「4321」と並んでいることが分かったので、上記に取り出したサンプルのように、2列目の番号を入れ替えた。


パーツの接続方法
Arduino NANO       MAX7219
5V  ---------------- VCC : 写真では「黄色」
GND --------------- GND : 写真では「緑色」
D11 --------------- DIN : 写真では「青色」
D10 --------------- CS : 写真では「紫色」
D13 --------------- CLK : 写真では「灰色」

使用した部品類
・8x32 LED MAX7219 Dot Matrix Module 
・Arduino NANO
・ブレッドボード

配線図・写真
    

Sketch (Source Code)

#include  <Adafruit_GFX.h>
#include <Max72xxPanel.h>
// Vcc - Vcc
// Gnd - Gnd
// Din - Mosi (Pin 11)
// Cs - SS (Pin 10)
// Clk - Sck (Pin 13)
const int pinCS = 10;
const int numberOfHorizontalDisplays = 4;
const int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
const int wait = 50;
const int spacer = 1;
const int width = 5 + spacer;
void setup(){
matrix.setIntensity( 1 ) ; // Adjust the brightness between 0 and 15
matrix.setPosition( 0, 3, 0) ; // The first display is at <0, 0>
matrix.setPosition( 1, 2, 0) ; // The second display is at <1, 0>
matrix.setPosition( 2, 1, 0) ; // The third display is at <2, 0>
matrix.setPosition( 3, 0, 0) ; // The fourth display is at <3, 0>
   matrix.setRotation( 0, 1) ;     // Display position
matrix.setRotation( 1, 1) ; // Display position
matrix.setRotation( 2, 1) ; // Display position
matrix.setRotation( 3, 1) ; // Display position
}
void loop(){
String string = "23:56";
matrix.fillScreen(LOW);
matrix.drawChar( 1, 0, string[0], HIGH, LOW, 1);
matrix.drawChar( 8, 0, string[1], HIGH, LOW, 1);
matrix.drawChar(13, 0, string[2], HIGH, LOW, 1);
matrix.drawChar(18, 0, string[3], HIGH, LOW, 1);
matrix.drawChar(25, 0, string[4], HIGH, LOW, 1);
matrix.write(); // Send bitmap to display
delay(wait);
}


参考としたブログ
https://earthbondhon.com/8x32-led-matrix-max7219-tutorial-with-scrolling-text/
 ここに書かれていたコードは、4つのマトリックスモジュールに対して文字列を流れるように表示するもの。

06/05/2019

Arduino UNO 超音波センサーロボットカーに後方センサーを追加

前回製作したArduino UNOのロボットカーでは、後退する際に、障害物に衝突してしまうケースが多発した。
それで、超音波距離センサーを後方にも追加(サーボコントロール無し)して、後方への衝突をできる限り回避するようにしてみた。
後方距離センサー用のピンは、トリガーピンをArduinoのD8に、エコーピンをD7に接続した。
スケッチは次のように加筆変更した。

I made my own robot tank that avoids and moves obstacles.
This robot tank uses an ultrasonic distance sensor that mounted in front of it to measure the distance to an obstacle and control the movement to move.
Since the processing power of the microcomputer is Arduino UNO that is not so high performance, it might be difficult to make a further advanced control. I added a sensor at the back of the tank to measure the distance to the obstacle behind it, so the robot tank can move around in a narrow place without collision.

《Sketch》

// Obstacle avoidance Tank Robot program 2019/06/05
// add backward sensor avoid collisions My Spice Cabinet
double Fdistance = 0;
double Rdistance1= 0;
double Ldistance1= 0;
double Rdistance2= 0;
double Ldistance2= 0;
double RRdist=0;
#include  <Servo.h>
int pinLB = 12; // direction control function
int pinLF = 10; // motors' control chip with speed control function
int pinRB = 13; // direction control function
int pinRF = 11; // motors' control chip with speed control function
int echoPin = 5; // define pin for sensor echo
int trigPin = 6; // define pin for sensor trig
int echoPinB = 7; // define pin for back sensor echo
int trigPinB = 8; // define pin for back sensor trig
int motorOnTime1; // motor on time back
int motorOnTime2; // turning motor on time
int directionn = 0; // forward=8 backward=2 left=4 right=6
Servo myServo; // set myservo
int delay_time = 250; // settling time 250 after steering servo motor moving B
int Fgo = 8; // Move Forward
int Rgo = 6; // move to the R
int Lgo = 4; // move to the L
int Bgo = 2; // move Backward
int angle;
void setup()
{
Serial.begin(9600);
pinMode(3, OUTPUT); // Head light
// Define motor output pin
pinMode(pinLB,OUTPUT); // pin 12 direction control function
pinMode(pinLF,OUTPUT); // pin 10 (PWM)
pinMode(pinRB,OUTPUT); // pin 13 direction control function
pinMode(pinRF,OUTPUT); // pin 11 (PWM)
// Define Front sensor pin
pinMode(echoPin, INPUT); // define input pin from sensor
pinMode(trigPin,OUTPUT); // define output pin for sensor
// Define Back sensor pin
pinMode(echoPinB, INPUT); // define input pin from sensor
pinMode(trigPinB,OUTPUT); // define output pin for sensor
myServo.attach(9); // Define servo motor output pin to D9 (PWM)
}
void advance()              // move to forward
{
digitalWrite(pinLB,LOW); // left wheel moves forward
digitalWrite(pinRB,LOW); // right wheel moves forward
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void stopp()                // all wheel stop
{
digitalWrite(pinLB,HIGH); // left wheel stop
digitalWrite(pinRB,HIGH); // right wheel stop
analogWrite(pinLF,0);
analogWrite(pinRF,0);
}
void right()                // turn right (single wheel)
{
digitalWrite(pinLB,HIGH); // wheel on the left stop
digitalWrite(pinRB, LOW); // wheel on the right moves backward
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void left()                 // turn left (single wheel)
{
digitalWrite(pinLB, LOW); // wheel on the left moves backward
digitalWrite(pinRB,HIGH); // wheel on the right stop
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void back()                 // move backward
{
digitalWrite(pinLB,HIGH); // motor moves to left rear
digitalWrite(pinRB,HIGH); // motor moves to right rear
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void detection()            // measure multi directions
{
angle = 90; // measure front direction
ask_pin_F(); // read the distance ahead
motorOnTime1 = 100;
motorOnTime2 = 200;
// ==========================================================
if(Fdistance < 30) // if distance ahead is <30cm
{
stopp(); // all wheel stop
delay(motorOnTime1);
back(); // move backward for 0.2S
delay(motorOnTime2);
}
// ----------------------------------------------------------
if(Fdistance < 50) // if distance ahead is <50cm
{
stopp(); // all wheel stop
delay(motorOnTime1);
// ==========================================================
angle = 5; // measure left direction
ask_pin_F(); // read distance on the left
Ldistance1 = Fdistance;
motorOnTime1 = 300;
motorOnTime2 = 300; // turn about 100deg, if 120deg --> 600
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
angle = 30; // measure left direction
ask_pin_F(); // read distance on the left
Ldistance2 = Fdistance;
motorOnTime1 = 100;
motorOnTime2 = 200;
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
angle = 120; // measure right direction
ask_pin_F(); // read distance on the right
Rdistance2 = Fdistance;
motorOnTime1 = 100;
motorOnTime2 = 200;
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
angle = 175; // measure right direction
ask_pin_F(); // read distance on the right
Rdistance1 = Fdistance;
motorOnTime1 = 300;
motorOnTime2 = 300; // turn about 100deg, if 120deg --> 600
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
if(Ldistance2 > Rdistance2) // if LH distance is >distance on the right
{
directionn = Lgo; // move to the L
}
// ----------------------------------------------------------
if(Ldistance2 <= Rdistance2) // if LH distance is <= distance on the right
{
directionn = Rgo; // move to the right
}
// ----------------------------------------------------------
if (Ldistance1 < 30 && Rdistance1 < 30) // if distance on LH and RH are both <30cm
{
directionn = Bgo; // move to backward
ask_pin_B();
}
}
// ----------------------------------------------------------
else // if distance ahead is >50cm
{
angle = 90;
ask_pin_F(); // read the distance ahead
directionn = Fgo; // move forward
}
}
void ask_pin_F()        // measure the distance ahead on the angle
{
myServo.write(angle);
delay(delay_time);
digitalWrite(trigPin, LOW); // ultrasonic sensor transmit low level signal 2μs
delayMicroseconds(2);
digitalWrite(trigPin,HIGH); // ultrasonic sensor transmit high level signal 10μs, at least 10μs
delayMicroseconds(10);
digitalWrite(trigPin, LOW); // keep transmitting low level signal
double Duration = pulseIn(echoPin, HIGH); // read the time in between
Fdistance = Duration/2*340*100/1000000; // convert time into distance (unit: cm)
// debugging the angle and its distance
Serial.print(angle);
Serial.print("- Distance ahead ");
Serial.print(Fdistance);
Serial.println(" [cm]");
}
void ask_pin_B()        // measure the distance backward
{
digitalWrite(trigPinB, LOW); // ultrasonic sensor transmit low level signal 2μs
delayMicroseconds(2);
digitalWrite(trigPinB,HIGH); // ultrasonic sensor transmit high level signal 10μs, at least 10μs
delayMicroseconds(10);
digitalWrite(trigPinB, LOW); // keep transmitting low level signal
double Duration = pulseIn(echoPinB, HIGH); // read the time in between
RRdist = Duration/2*340*100/1000000; // convert time into distance (unit: cm)
// debugging the angle and its distance
Serial.print("Distance backward ");
Serial.print(RRdist);
Serial.println(" [cm]");
}
void loop()
{
// Head light
Serial.print("CDS Value = ");
Serial.println(analogRead(0));
digitalWrite(3, LOW);
if(analogRead(0)<400) digitalWrite(3, HIGH);
// driving forward ----------------------------
angle=90;
myServo.write(angle); // home set the servo motor, ready for next measurement from 90
detection(); // measure the angle and determine which direction to move
if(directionn == 2) // if direction => backward
{
if(RRdist > 25)
{
back(); // go backward
delay(motorOnTime1);
left(); // Move slightly to the left (to prevent stuck in dead end)
delay(motorOnTime2);
}
else
{
stopp();
delay(motorOnTime2);
}
}
// ---------------------------------------------
if(directionn == 6) // if direction => right
{
back(); // go backward
delay(motorOnTime1);
left(); // turn left because reverse driving
delay(motorOnTime2);
}
// ---------------------------------------------
if(directionn == 4) // if direction => left
{
back(); // go backward
delay(motorOnTime1);
right(); // turn right because reverse driving
delay(motorOnTime2);
}
// ---------------------------------------------
if(directionn == 8) // if direction => forward
{
advance(); // move forward
delay(motorOnTime1);
}
}

06/04/2019

Arduino UNO で Robot Car 製作

超音波センサーで周囲のスペースを検知し動き回るタンクロボットを作った。
Img_20190602_085716 Img_20190602_085732 Img_20190602_085744 Img_20190602_085755      
    
使用した部品は、下記の通り
 ①ロボットシャシー:P Prettyia アルミ合金のタンクシャシーをAmazonから購入
 ②Arduino UNO x 1個
 ③超音波距離センサーモジュール:HC-SR04 x 1個
 ④デジタル・マイクロサーボ:SG90 x 1個
 ⑤モータドライバシールド:WINGONEER L298Pモータドライバモジュール
             Arduino用高出力DCステッパモータコントローラ x 1
  https://www.instructables.com/id/Tutorial-for-L298-2Amp-Motor-Driver-Shield-for-Ard/ 
 ⑥Miniブレッドボード:Arduino用170タイポイント Miniブレッドボード x 1個
 ⑦トグルスイッチ x 1
 ⑧18650バッテリー2個用ホルダー x 2個
 ⑨18650バッテリー  x 4個
 ⑩その他、バッテリーを載せるトレイ(100均で調達)、シールド電線少々

・ロボットシャシー:P Prettyia アルミ合金のタンクシャシー は、組立て説明書が添付されず、構成部品だけが送られてくるので、組み上がった写真を見て組立て方法を考える必要がある。送られてきたパーツの数が間違えているのではないかと組立てながら疑った事もあった。キーポイントは、モーター軸に組み付けるハブの組立て状況を写真をよく見て調べることだ。

・モーターを制御するために、僕はWINGONEER のL298Pモーターシールドを使った。
・将来構想として、WiFi あるいは Bluetooth でのラジコンを考えているので、周囲の明るさに応じて、自動的にヘッドライトを点灯する回路を追加した。


《Sketch》

// Obstacle avoidance Tank Robot program 2019/06/04
// My Spice Cabinet http://spice-cabinet.cocolog-nifty.com/blog/
double Fdistance = 0;
double Rdistance1= 0;
double Ldistance1= 0;
double Rdistance2= 0;
double Ldistance2= 0;
#include  <Servo.h>
int pinLB = 12; // direction control function
int pinLF = 10; // motors' control chip with speed control function
int pinRB = 13; // direction control function
int pinRF = 11; // motors' control chip with speed control function
int echoPin = 5; // define pin for sensor echo
int trigPin = 6; // define pin for sensor trig
int motorOnTime1; // motor on time back
int motorOnTime2; // turning motor on time
int directionn = 0; // forward=8 backward=2 left=4 right=6
Servo myServo; // set myservo
int delay_time = 250; // settling time 250 after steering servo motor moving B
int Fgo = 8; // Move Forward
int Rgo = 6; // move to the R
int Lgo = 4; // move to the L
int Bgo = 2; // move Backward
int angle;
void setup()
{
Serial.begin(9600);
pinMode(3, OUTPUT); // Head light
// Define motor output pin
pinMode(pinLB,OUTPUT); // pin 12 direction control function
pinMode(pinLF,OUTPUT); // pin 10 (PWM)
pinMode(pinRB,OUTPUT); // pin 13 direction control function
pinMode(pinRF,OUTPUT); // pin 11 (PWM)
// Define sensor pin
pinMode(echoPin, INPUT); // define input pin from sensor
pinMode(trigPin,OUTPUT); // define output pin for sensor
myServo.attach(9); // Define servo motor output pin to D9 (PWM)
}
void advance()                   // move to forward
{
digitalWrite(pinLB,LOW); // left wheel moves forward
digitalWrite(pinRB,LOW); // right wheel moves forward
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void stopp()                       // all wheel stop
{
digitalWrite(pinLB,HIGH); // left wheel stop
digitalWrite(pinRB,HIGH); // right wheel stop
analogWrite(pinLF,0);
analogWrite(pinRF,0);
}
void right()                       // turn right (single wheel)
{
digitalWrite(pinLB,HIGH); // wheel on the left stop
digitalWrite(pinRB, LOW); // wheel on the right moves backward
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void left()                         // turn left (single wheel)
{
digitalWrite(pinLB, LOW); // wheel on the left moves backward
digitalWrite(pinRB,HIGH); // wheel on the right stop
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void back()                        // move backward
{
digitalWrite(pinLB,HIGH); // motor moves to left rear
digitalWrite(pinRB,HIGH); // motor moves to right rear
analogWrite(pinLF,255);
analogWrite(pinRF,255);
}
void detection()            // measure multi directions
{
angle = 90; // measure front direction
ask_pin_F(); // read the distance ahead
motorOnTime1 = 100;
motorOnTime2 = 200;
// ==========================================================
if(Fdistance < 30) // if distance ahead is <30cm
{
stopp(); // all wheel stop
delay(motorOnTime1);
back(); // move backward for 0.2S
delay(motorOnTime2);
}
// ----------------------------------------------------------
if(Fdistance < 50) // if distance ahead is <50cm
{
stopp(); // all wheel stop
delay(motorOnTime1);
// ==========================================================
angle = 5; // measure left direction
ask_pin_F(); // read distance on the left
Ldistance1 = Fdistance;
motorOnTime1 = 300;
motorOnTime2 = 300; // turn about 100deg, if 120deg --> 600
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
angle = 30; // measure left direction
ask_pin_F(); // read distance on the left
Ldistance2 = Fdistance;
motorOnTime1 = 100;
motorOnTime2 = 200;
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
angle = 120; // measure right direction
ask_pin_F(); // read distance on the right
Rdistance2 = Fdistance;
motorOnTime1 = 100;
motorOnTime2 = 200;
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
angle = 175; // measure right direction
ask_pin_F(); // read distance on the right
Rdistance1 = Fdistance;
motorOnTime1 = 300;
motorOnTime2 = 300; // turn about 100deg, if 120deg --> 600
delay(delay_time); // stabilizing time for servo motor
// ==========================================================
if(Ldistance2 > Rdistance2) // if LH distance is >distance on the right
{
directionn = Lgo; // move to the L
}
// ----------------------------------------------------------
if(Ldistance2 <= Rdistance2) // if LH distance is <= distance on the right
{
directionn = Rgo; // move to the right
}
// ----------------------------------------------------------
if (Ldistance1 < 30 && Rdistance1 < 30) // if distance on LH and RH are both <30cm
{
directionn = Bgo; // move to backward
}
}
// ----------------------------------------------------------
else // if distance ahead is >50cm
{
angle = 90;
ask_pin_F(); // read the distance ahead
directionn = Fgo; // move forward
}
}
void ask_pin_F()            // measure the distance ahead on the angle
{
myServo.write(angle);
delay(delay_time);
digitalWrite(trigPin, LOW); // ultrasonic sensor transmit low level signal 2μs
delayMicroseconds(2);
digitalWrite(trigPin,HIGH); // ultrasonic sensor transmit high level signal 10μs, at least 10μs
delayMicroseconds(10);
digitalWrite(trigPin, LOW); // keep transmitting low level signal
double Duration = pulseIn(echoPin, HIGH); // read the time in between
Fdistance = Duration/2*340*100/1000000; // convert time into distance (unit: cm)

// debugging the angle and its distance
Serial.print(angle);
Serial.print("- Distance ahead ");
Serial.print(Fdistance);
Serial.println(" [cm]");
}
void loop()
{
// Head light
Serial.print("CDS Value = ");
Serial.println(analogRead(0));
digitalWrite(3, LOW);
if(analogRead(0)<400) digitalWrite(3, HIGH);
// driving forward ----------------------------
angle=90;
myServo.write(angle); // home set the servo motor, ready for next measurement from 90
detection(); // measure the angle and determine which direction to move
if(directionn == 2) // if direction => backward
{
back(); // go backward
delay(motorOnTime1);
left(); // Move slightly to the left (to prevent stuck in dead end)
delay(motorOnTime2);
}
// ---------------------------------------------
if(directionn == 6) // if direction => right
{
back(); // go backward
delay(motorOnTime1);
left(); // turn left because reverse run
delay(motorOnTime2);
}
// ---------------------------------------------
if(directionn == 4) // if direction => left
{
back(); // go backward
delay(motorOnTime1);
right(); // turn right because reverse run
delay(motorOnTime2);
}
// ---------------------------------------------
if(directionn == 8) // if direction => forward
{
advance(); // move forward
delay(motorOnTime1);
}
}



《参考資料》
参考にしたSketch
https://s.siteapi.org/b2a66604b1dde25.ru/docs/1a8777f11b3ec42b322a4659688401e914be7efd.pdf
これを使ったロボットは私のものより少し小さい?ので、モーターを制御するタイミング時間で、動き方がかなり変わっているように思ったので、自分が納得する動きをさせるために、スケッチは大きく変更した。

PWMで明るさを調整できるanalogWrite関数
https://voltechno.com/blog/aruled/

LEDライトのコントロール
https://www.denshi.club/pc/kits/led2arduinol.html
2N7000 x1、75Ω、47KΩ

24 暗くなったらLEDを点滅させる
https://n.mtng.org/ele/arduino/samples/sample24.html
CDS x1、10KΩ

06/01/2019

Arduino UNO で周囲が暗くなったらLEDを点灯する回路

Img_20190601_125557LedarduinoLed
ロボットカーの製作を予定しているが、周囲が暗い時はヘッドライトを自動点灯させたい。
ただし、LEDライトは、2個のLEDを並列につないだライトとなるので、直接制御できない。
流れる電流値も大きいので、それを配慮したMOS FETの 2N7000 を用いた回路構成とする。
Arduinoで使うPWMピンは、pin9(D9) で、CDSの抵抗変化用にアナログピンA0を使う。

参考資料に掲載されているブログ内容と、スケッチを参考に考えてみた。
下記スケッチでプリント文は、回路機能のチェック用に追加したもの。

《Sketch》


// Arduino用プログラム:周囲が暗くなったらLEDを点滅させる 2019/06/01
void setup() {
pinMode(9, OUTPUT);
Serial.begin(9600); // 9600bpsでシリアルポートを開く
}

void loop() {
Serial.print("CDS Value = "); // 処理内容チェック用プリント
Serial.println(analogRead(0));
// A0にCDSと10kΩを接続、CDSの片方は5Vへ、10kΩの片方はGNDへ接続
if(analogRead(0)<700) { // CDSの周りが暗い時は700の値を小さくする
// CDSの値が700以下になったらD9に接続したLEDを0.5秒間点灯・点滅を繰り返す
digitalWrite(9, HIGH);
delay(500);
}
digitalWrite(9, LOW);
delay(500);
}

《参考資料》
①白色LEDサークル・ライト その2 ArduinoでLチカ
https://www.denshi.club/pc/kits/led2arduinol.html )
 Arduino 以外に使用する部品は、
  2N7000 x1
  75Ω x1 (100Ω前後で可)
  47KΩ x1 (10k~100kΩの間の抵抗で可。ここでは20kΩを使った。)

②24 暗くなったらLEDを点滅させる
https://n.mtng.org/ele/arduino/samples/sample24.html )
 Arduino 以外に使用する部品は、
  CDS x1
  10KΩ x1

05/26/2019

TM1637を使ってGPS時計を作ってみた

GPS時計は、3つの構成部品とジャンパーケーブルで実現できた。
Img_20190524_164610  Img_20190525_074504
 
構成部品
①GPSユニット:太陽誘電製の小型高感度GPSモジュールGYSFDMAXB
②表示ユニット:4桁7セグメントモジュール TM1637
③Arduino : NANO


Fritzing を使って回路を描いてみた。
 Gpsfritzing2 木造家屋の、窓から約4mの壁に取り付けてみたが、本題なく表示できた。



Sketch

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include "SevenSegmentTM1637.h"
#include "SevenSegmentExtended.h"
static const int RXPin = 4, TXPin = 3;  // TX -> D4, RX -> D3
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
const byte PIN_CLK = 6;   // define CLK pin (any digital pin)
const byte PIN_DIO = 7;   // define DIO pin (any digital pin)
SevenSegmentExtended      display(PIN_CLK, PIN_DIO);
int Satellites = 12;
int hours = 0;
int minutes = 0;
int wasMinute = 99; // used for blanking leading zero
int DSTEST = 9;
int TwelveTwentyFour = 24;
void setup() {
 Serial.begin(115200);
 ss.begin(GPSBaud);
 display.begin();            // initializes the display
 display.setBacklight(100);  // set the brightness to 100 %
 delay(1000);                // wait 1000 ms
 hours = 99;
 minutes = 99;
 display.printTime(hours, minutes, true);  // display time
 pinMode(Satellites, INPUT_PULLUP);
 delay(1000);
}
void loop() {
 while (ss.available() > 0)
   if (gps.encode(ss.read()))
     displayInfo();
 if (millis() > 5000 && gps.charsProcessed() < 10)   {
   Serial.println(F("No GPS detected: check wiring."));
   while (true);
 }
}
void displayInfo() {
 int SW5 = digitalRead(Satellites);
 if (SW5 == LOW) {
   display.print("Sat=");
   delay(500);
   display.clear();
   int temp = gps.satellites.value();
   Serial.print("temp = ");
   Serial.println(temp);
   display.print(gps.satellites.value());
   Serial.print("Satellites Seen = ");
   Serial.println(gps.satellites.value());
   delay(1000);
 }
 Serial.print(F("Location: "));
 if (gps.location.isValid())  {
   Serial.print(gps.location.lat(), 6);
   Serial.print(F(","));
   Serial.print(gps.location.lng(), 6);
 }
 else
 {
   Serial.print(F("INVALID"));
 }
 Serial.print(F("  Date/Time: "));
 if (gps.date.isValid())   {
   Serial.print(gps.date.month());
   Serial.print(F("/"));
   Serial.print(gps.date.day());
   Serial.print(F("/"));
   Serial.print(gps.date.year());
 }
 else
 {
   Serial.print(F("INVALID"));
 }
 Serial.print(F(" "));
 if (gps.time.isValid())   {
   if (gps.time.hour() < 10) Serial.print(F("0"));
   Serial.print(gps.time.hour() + 9 ); // time ZONE mod
   Serial.print(F(":"));
   if (gps.time.minute() < 10) Serial.print(F("0"));
   Serial.print(gps.time.minute());
   Serial.print(F(":"));
   if (gps.time.second() < 10) Serial.print(F("0"));
   Serial.print(gps.time.second());
   Serial.print(F("."));
   if (gps.time.centisecond() < 10) Serial.print(F("0"));
   Serial.print(gps.time.centisecond());
/////////////////To Clock LED Display/////////////////////////////
   int hours = gps.time.hour(); 
   Serial.print(" DST = ");    Serial.print(DSTEST);    int timezonehr = DSTEST;    hours = hours + timezonehr;    if (hours > TwelveTwentyFour - 1) {      hours = hours - TwelveTwentyFour;      if (hours == 0) hours = 12; // make sure shows 12 at noon    }    else {      if (hours < 0) {        hours = hours + TwelveTwentyFour;      }    } /////////////////To Clock LED Display/////////////////////////////    int minutes = gps.time.minute();    if (minutes  != wasMinute) {      Serial.print("Hours just before sent to LED ");      Serial.println(hours);      display.printTime(hours, minutes, false);  // display time      if (   hours <= 9) {        display.print(" ");      }      wasMinute = minutes;    }  }  else  {    Serial.print(F("INVALID"));  }  Serial.println(); }


参考にしたブログ
7セグLED表示 その7 4文字-TM1637
GPS Set Clock ・・・ Sketchは、このブログを引用して作成させて貰った。

01/25/2019

Linux Mint 19.1 に Arduino IDE (1.8.9)をインストールする

Linux Mint 19.1 を Desktop Windows PC と同じように使うため、Mint 19.1 に Arduino IDE もインストールすることにした。

1)まず、ここから Arduino IDEのLinux 64 bits 最新版(ARDUINO 1.8.9)をダウンロードする

 ダウンロードしたファイルは、ダウンロードフォルダに「
arduino-1.8.9-linux64.tar.xz」名で格納される。

2)コマンドライン端末を起動させてから、

 $ cd ダウンロード
 英字設定のままなら、 $ cd Downloads 

 として、ダウンロードフォルダに移ってから、
 念の為に、 $ ls  と打ち込んでフォルダの中を確認して・・・


 フォルダの中にダウンロードしたファイルの存在を確認後、下記のように入力して解凍する。

 $ tar -Jxvf arduino-1.8.9-linux64.tar.xz

 その結果、ダウンロードフォルダの中に「arduino-1.8.9」フォルダが作られ、その中に解凍したファイルが収められる。
 これも、 $ ls  として確認すると・・・  青字で 
arduino-1.8.9 が表示される。

3)次に
「arduino-1.8.9」フォルダを下記コマンドで /opt に移動させる

 $ sudo mv arduino-1.8.9 /opt

4)インストールを進めるために、下記コマンドにより作業ディレクトリを /opt/arduino-1.8.9 に移動する

 $ cd /opt/arduino-1.8.9/
 念の為、ここでも  $ ls  と打ち込んで確認する。 一覧の中に 
install.sh  が緑色の文字で表示されるはず。

5)ここまででインストールの準備ができたので、下記コマンドでインストールを行う。

 $ ./install.sh

 と打ち込んだ直後、

 Adding desktop shortcut, menu item and file associations for Arduino IDE... done!
 と表示される。

 インストールとは、 デスクトップ にショートカットを作成するだけらしい。

01/15/2019

Arduino ESP32 の開発環境インストールと書込みまでのメモ

Arduino ESP32を使って作りたいものがあったのだが、コンパイル途中で停まってしまったり、書き込みが出来ない状態が続いていた。半ば諦めかけていたが「どうしてもESP32で作りたい!」その気持ちが後押ししてくれ、書込みまでのステップができるようになった。

そのきっかけは、
ちょっと古い自作Winows10 PCの起動時の時間が長いので・・・そのPCをクリーンインストールしたことからはじまる。

Arduino ESP32 の開発環境を作り直し、マニュアルでのESP32書込みステップを読み直して実行してみた。その結果、書込みまでの作業が可能となったので、ここにメモにしておく。

しかし、もしかすると、書き忘れていることもあるかも知れないので、ここに書いた事を行えば、必ず再現できるか否かは確約することができない。


まず、自作PC(Windows10 Pro 64bit)の仕様は、・・・
・AMD FX-8320E 8-Core Processor 3.20GHz
・実装RAM  20.0GB
・Windows 10 Pro  64bit OS (もとは、自作パーツと併せ買いした Windows7のDSP版)


今回、Windows10としてクリーンインストールする際に、これまでCドライブとして使っていたSSD上のOS、データ、パーティションはインストール時に全て削除し、新しいOSをインストールした。

不安だったのは、インストール完了時に要求されるだろうアクティベーションコードをどうすればいいのか?という疑問だった。 Windows10のアクティベーションコードは明示されていないようだし、何を入力すればよいのか?


調べてみると、
Microsoft情報には、クリーンインストールでは「Windows10をインストール後、ネット上で自動的にアクティベーション作業が行われる」と書かれている。これが上手くいかなければ、OSは再購入になるなぁ・・・と不安だったが、それを信頼し作業した。

OSインストールが終了後、アクティベーション作業もなく、PCは快適に使えている。


アプリの再インストールに際して、これまで殆ど使わず、不要と思われるものは、インストールしないようにした。CPUは、それほど早いものではないが、起動時間もあまり気にならない。PC起動時に入力するパスワードは、PIN入力(4文字の入力)で済むような設定になった。これは便利だと思う!


余談だが、PINによる起動パスワード入力は、他のWindows10でも出来る筈・・・と思って、グーグルで調べてみたら、次のような手順で設定できることが分かったので、僕は他のPCにも使っている。


《PINによる起動パスワード入力の手順

Windows画面左下の「スタート(ボタン)」をマウスで右クリック⇒メニューから「設定」を選び⇒開いた画面の中の「アカウント」をクリック⇒「サインイン オプション」を選んで⇒「PIN」「 追加」 とたどって・・・ 必要な入力設定を行えば、PCの起動パスワードは、PINに変えて入力出来るようになる。
 これは、もし4桁のPIN数字を、あなたが「1234」と設定すると、いつも入力するパスワード入力画面では、パスワードではなくPINを入力するように促されるので、「1234」と入力すれば、複雑で長いパスワードを打ち込まなくても済むということ。


ここまでは、余談・・・

Arduino ESP32の統合開発環境のインストール

①まず、Arduino IDEのダウンロードとインストール
Arduino_ide_188_downloadStable版 1.8.8 をダウンロードして・・・
おすすめはZIP形式(2行目)をダウンロードしてインストールすること。Arduino UNO と ESP8266 でIDEのバージョンを使い分けできるらしい。これにより、バージョンによって動作したりしなかったりという問題を回避できるらしい。
しかし、僕は深く考えずに、一番上のWindowsインストーラーを使ったものを選んでインストールしてしまった。今のところ、特に問題を感じていない・・・。




.

②ソフトウェア
https://github.com/espressif/arduino-esp32.git にアクセスして、
緑色のボタン「Clone or download」をクリックする。
ポップアウトウインドウが開くので、右下側の「Download ZIP」
ボタンをクリックしてダウンロードする。

Arduino_esp32 僕は、ダウンロードしたZIPファイルを
左図のように、
ローカルディスクの下に展開して置いた。

配置した中の toolsフォルダーの中にある「get.exe」を管理者権限で実行する。

コンソールが開き必要なファイルのインストールが始まる。

Arduino-ESP32のインストール
既にArduino-ESP32をインストールした古い環境を持っている場合には、フォルダーごと削除してから、新しい環境を再インストールしないとだめらしい。

GitHubの以下のページを開いて・・・
https://github.com/espressif/arduino-esp32

Instaration_instructions開いたページを下方に移動して、
Installation Instructions の項目のすぐ下方にある
青字の
Instructions for Boards Manager をクリックする。








.

Arduino_ide_boards_manager次のページ(左図)で、図の下方にある「Stable release link (安定版)」の右に表示されているURLをコピーして・・・

尚、開発途中の最新版を使う場合には、その下にある「Development release link」をコピーしておき、

Arduino IDEを起動して、ファイル⇒環境設定を開く。

④Arduino IDEの環境設定方法は、
まず、Arduinoを起動後、ファイルタブをクリックして⇒表示されたメニューの下方にある環境設定をクリックする。
次に、表示された「環境設定」の窓の下方にある「追加のボードマネージャのURL」と書かれた右枠に上記でコピーしたURLをペーストする。
このとき、入力枠右側のアイコンをクリックすると、URLを入力できる多少広い画面が表示されるので、作業しやすくなる。また、複数(Stable版とDevelop版の2つ)を入力する場合にも、ここを使う。
もしマウスでペーストが上手くできない場合には、ペーストする場所にマウスカーソルを移してから「Ctrl」+「V」を同時押しすれば、その場所にペーストできる。
ペーストが出来れば「OK」ボタンを押して、この画面と環境設定の画面を閉じる。

⑤次に、ボードマネージャを設定する。
Img_20190115_090852b 既に起動させていると思うが、Arduino IDEの「ツール」タグをクリックし、 メニューを下方に辿り、「ボード:”Arduino/Genuino Uno”」 などと書かれている部分にマウスカーソルを合わせると、ボードマネージャの一覧が表示される。左図のように「ボードマネージャ...」と書かれた一番上の行をクリックする。

ボードマネージャの窓が開く。



.

Photoネット上のデータをダウンロードして表示しようとするので、しばらく時間がかかるかもしれない。

ダウンロードが終われば、「全て」と書かれた右側の枠に「esp32」と入力する。





Esp32「インストール」のボタンをクリックする。

インストールが完了したら、「閉じる」ボタンをクリックして終了する。

これで、ESP32 のディバイスボードの一覧が追加されたので、
先ほどと同じように、「ツール」⇒
「ボード:”Arduino/Genuino Uno”」と辿ってゆけば、ESP32 Arduinoのボードが現れる。




Img_20190115_113231 Img_20190115_113256 僕が今回使おうとしているボードは、
「DOIT ESP32 DEVKIT V1」
左図のようなものである。



.


Img_20190115_170705a 左図にあるように、ボードリストを辿って
「DOIT ESP32 DEVKIT V1」を探す。

あった!

もしリストに無ければ、「ESP32 Dev Module」を選んでも、何とかなるらしい。










.
Img_20190115_172945aESP32ボード「DOIT ESP32 DEVKIT V1」 あるいは 「
ESP32 Dev Module」をクリックした後で、ボードを確認してみると、書き込み装置が・・・何か変だ!


書込み装置は、「USBasp」を選択すること。

僕は、当初「ここ(書き込み装置)!」にあまり注目していなかったので、うまく書込みできなかったと思う。忘れないように
「USBasp」を選択すること。

COMポートが複数表示されていて、どちらを選べばよいか分からない場合には、
「スタート」マウス右クリック⇒「デバイスマネージャー」と辿って、デバイスマネージャーのリストの中からポート(COMとLPT)と表示されたところの「>」部分をクリックして、ポートの状態を確認する。

僕の場合は、確認すると下図のようであった。

Photo_2
それで、ESP32を接続したCOMポートが
COM3であることがわかる。







さて、僕がブレッドボード上に組み上げたもの(下図)で、コンパイルから書込みまで試してみよう・・・
Img_20190115_113153sketchの書き込みは、ちょっとテクニックが必要だ。

USB差し込みの両側に「EN」と「BOOT」のボタンがある。書込みの際に、これらのボタンを押さなければならないので、ESP32ボードをブレッドボードに差し込む際には、このことを配慮しなければならない。








.
skechのコンパイルから書き込みまで
 僕がやって、成功した方法
①コンパイル状態から書込みが始まるまで
 「EN」「BOOT」両方のボタンを押し続ける 
 このとき、進捗状況を示す「緑の横棒グラフ表示」が、100%になったようだからと思い、ここで「EN」ボタンから指を放してはいけない。

②コンパイルが終わって、書込みを開始しようとしたところ(赤字でリスト表示が始まったところ)で、  「BOOT」ボタンは押したままで、「EN」ボタンから指を放す。


③無事に書込みが始まったら、
 「BOOT」ボタンから指を放す。

④あとは書き込みが終わるのを待つだけ・・・

もし、②~③のステップが上手く行かないときには、書き込み速度が速すぎるのかも知れないので、「ツール」⇒「Upload Speed:」を 921600 ⇒ 115200 に変更して書き込んでみる。

これで上手く行かなかった場合には、他の問題もあるのかも知れない。

 

July 2019
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Recent Trackbacks

無料ブログはココログ