07/09/2019

Arduino NANO を使って BME280 で計測し LCD(16x2) に表示する

Img_20190709_121953 Img_20190709_122102
Arduino NANO を使って BME280 で、温度・湿度・気圧を計測し、結果を LCD(16x2) に表示する。
当初、LCD(16x2)の使い方が分からないので、ブログの簡単な事例でトライアルしてみたが、正しいはずの Sketch で、エラー無くコンパイルされたのに、画面は真っ白のまま・・・何故なのだろうと調べた挙句、LCD裏面の可変抵抗を調整して画面の明るさを加減しないと、表示された文字が見えないという事が分かった。わかってしまえば簡単な事なのに・・・、それで表示問題は解決。

BME280 と LCD どちらも I2C で接続するにはどうすれば良いのか・・・と悩んでいたが、BME280 は SPI 接続し、LCD は I2C 接続する方法で試したら上手くできた。Arduino NANO との接続方法は、下記の Sketch の中に書き入れた。

LCD は2行表示なので、温度、湿度、気圧を同時に表示することは出来ない。 2行を使い3行分のデータを順にまわして表示するか・・・とも考えたが、Sketchが面倒なので、温度表示は固定し、湿度と気圧を 3秒毎に上書き表示するようにしてみた。1行分のデータを、それぞれめいっぱい使えば、上書き時に完全に置き換えが出来る。

シリアルモニターにも表示できるようにしておいた。

という事で、スケッチは下記のようにすれば、完成!

《Sketch》
// Even though the sketch is correct,
// the text can not be seen without adjusting the LCD contrast.
// BME280 --- Arduino NANO (SPI connection)
//      CSB --- D10
//      SDA --- D11
//      SDO --- D12
//      SCL --- D13
// LCD(16x2) --- Arduino NANO (I2C connection)
//         GND --- GND
//         VCC --- 5V
//         SDA --- A4
//         SCL --- A5

#include <Wire.h>
#include "SparkFunBME280.h"
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR  0x3F
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);  // I2C: 0x3F, 16x2 LCD
const int SPI_CS_PIN = 10;
BME280 sensor;

void setup() {
lcd.init();
lcd.backlight();
Serial.begin(115200);
Wire.begin();
sensor.beginSPI(SPI_CS_PIN);
}

void loop() {
Serial.print("Temp: ");
Serial.print(sensor.readTempC(), 2);
Serial.print(" °C, Humidity: ");
Serial.print(sensor.readFloatHumidity(), 2);
Serial.print(" %, Pressure: ");
Serial.print(sensor.readFloatPressure() / 100.0, 1);
Serial.println(" hPa");

lcd.setCursor(0, 0);
lcd.print("Temp. " + String(sensor.readTempC()) + " deg");
lcd.setCursor(0, 1);
lcd.print("Humid. " + String(sensor.readFloatHumidity()) + " % ");
delay(3000);
lcd.setCursor(0, 1);
lcd.print("Prs. " + String(sensor.readFloatPressure()/ 100.0) + " hPa");
delay(3000);
}

07/07/2019

玄関先にある郵便受けが開いた回数を表示する

Img_20190707_163620 Img_20190707_163717  
前回作成したタクトスイッチを押した回数を表示する装置を利用して、玄関先に設置の郵便受けが開いた回数を表示するようにした。
郵便受けが開いたことを知らせる装置は、「ポストに郵便物が入ったらLEDを点灯するには・・・3(2016/12/6)」の記事などを参考に見て戴きたい。
右側装置の時計表示の上側にある部分は、郵便受けが開いたという信号を受けるもので、受信した信号を、フォトカプラを使って左側の装置に2本の線(水色・白色)で信号を送り、回数を8x8ドットマトリックスLEDで表示する。

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/23/2019

ナレーション入りの音楽からナレーションを抜き出す

Kirin音楽に乗った調子のよいナレーションを見つけた。

キリン メッツ「超ラジオ体操 第一」  藤森くんのチャラいラップも、ゴールドのジャージの「あっちゃん」も、かっこいいです!

それで、自分が通う運動ジムで「ナレーションだけでも覚えて、使いたい!」と思ったが・・・、とても自分が口頭で言うのは無理そうなので、音楽のナレーション部分を抜き出せないか・・・と調べてみた。

最初に見つけた方法は、音楽編集ソフト「Audacity」を使う方法だったが、説明にある通りに進めて・・・ところが・・・途中から表示されるメニューが違う! 
何かが違っていて、自分のやり方に問題があるのかもしれないが、あるところで行き詰ってしまうので、別の方法を探してみることにした。

その方法は、絵にある『「音キりす」v1.0』を使った方法。これは、Windows10でも使えた!
純粋にナレーションのみを抜き出す事は出来なかったが、かなり高いレベルでナレーションを引き出すことができた。

まず、音楽ファイルは、Waveファイルにしておく必要がある。
ファイルを指定した後、左画面の下にある再生ボタン「▶」を押して、再生音楽を聴きながら、そこから切り出すナレーションの音質などを、周波数と音の定位枠(マゼンタ色の枠)を調整しながら(GUIで簡単に)切り出す音の調整を行うことができる。

表示されるドットが 赤色->黄色 となるほど強い音を示している。

納得できる切り出し範囲を決めた後、ファイルを保存して・・・保存したファイルを再生してみた! いい感じで保存できている。

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は、このブログを引用して作成させて貰った。

05/09/2019

Linux Mint 19.1 に Virus 対応ソフト ClamAV を Install

Linux Mint 19.1 MATE の再 Install 後、Internet Security ソフト「COMODO」のインストールがうまく進まず、途中で止まってしまう。原因はまだ良くわかっていないが、セキュリティを放置しておく訳にはいかないので、別のVirus 対応ソフト ClamAV を Install した。
参考にしたのは、Narrow Escape 「 2018/7/30 LinuxMint 19: Virus scan with ClamAV 」の中の記事である。

コマンドライン端末を開いて、上記のURLの中に書かれている設定手順通りに Install 作業を行った。
1.clamav package のInstall
  $ sudo apt install -y clamav

 Install したら、次のclamscanコマンドで、ファイルまたはディレクトリをスキャンする。
   -r オプションは、ディレクトリを再帰的にスキャンし、
   -i オプションは、検出されたファイルのみを表示する。
  $ mkdir ~/virus
  $ clamscan -r -i --move=$HOME/virus .

2.次に virus database を freshclam を使って手動でアップデートする
  $ sudo freshclam

  しかし、clamavパッケージと一緒に clamav-freshclam pakcageをインストールしたので、次のようなエラーが発生する。
   ERROR: /var/log/clamav/freshclam.log is locked by another process
   ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).

3.clamav-freshclamパッケージを使ってウイルスデータベースを自動的に更新する
  clamav-freshclamパッケージはウイルスデータベースを自動的に更新します。freshclamコマンドを実行する必要はありません。しかし、clamav-freshclamによる初回更新時には、下記の警告が表示されうまくいかない。

  初めてアップデートする場合は、clamav-freshclamを停止し、freshclamコマンドを手動で実行してclamav-freshclamを起動します。
  $ sudo systemctl stop clamav-freshclam
  $ sudo freshclam
  $ sudo systemctl start clamav-freshclam

  デフォルトの更新間隔は1日に24回です。

4.clamav-daemonパッケージを使ったウイルススキャン
  clamav-daemonパッケージにはclamdデーモンとclamdscanコマンドがあります。clamdデーモンはデータベースを1回ロードしてデーモンとして待機します。データベースをロードせずにclamdscanコマンドからの要求によってウイルススキャンを実行します。
  clamdデーモンは常にデータベース用のメモリを消費しますが、clamdscanはclamscanよりも高速です。そしてclamdscanの動作はclamdに依存し、clamscanの動作はclamscanのオプションに依存します。

5.clamtkパッケージを使ったウイルススキャン
  clamtkパッケージはGUIウィンドウを提供します。
  $ sudo apt install -y clamtk

  スキャン後のダイアログメッセージに問題があります。LC_TIME = Cが設定されていないと、スキャン後のダイアログメッセージは表示されません。これは、スキャン後に検出されたファイルを削除するのを防ぎます。
  そのため、この記事ではデスクトップファイルでLC_TIME = Cを設定します。デスクトップファイルなしでclamtkを実行するにはLC_TIME = Cを設定する必要があります。

04/30/2019

tp-link Archer T1U v2 AC450 を Linux Mint 19.1 で使う

Archer T1U v2 AC450 を Linux Mint 19.1 で使おうとして、ネット上をいろいろ探し回って、出来ることは殆ど試してみたが、全て失敗した。
そんなとき、ここ( https://askubuntu.com/questions/1083281/cant-install-driver-for-tp-link-t1u-usb-on-ubuntu-18-04-kernel-4-15-0-36-gener )にある書込み「Kernel 4.19 has a working drive. 」を見つけた!

そこで、自分が MacBook Proに入れている Linux Mint 19.1 の kernel のバージョンを確認してみた。
$ uname -r 
4.15.0-48-generic  と表示された。

これを書いている 2019/4/30 時点での最新カーネルをアップデートマネージャで調べる(下記のようにして)、
アップデートマネージャ(画面右下にある盾のアイコン) > ツールメニューから「表示」をクリックして、調べると、
4.18.0-18 
になっている。 これではまだ Archer T1U v2 AC450 を動かせる driver はインストールされていないかも知れない。
それで、kernel を 4.19 にする方法を調べてみた。

kernel を 4.19 にするアップデートのやり方は、
ここ( MANIAC How to : Update Kernel 4.19 stable on Ubuntu / Linux Mint system )に記載されているので、そのまま試してみた!

Terminal を開いて、下記コマンドを実行する・・・(コピーしたものを貼り付けるが、上記のURLからコピーするのが良いだろう。)

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19/linux-headers-4.19.0-041900_4.19.0-041900.201810221809_all.deb \\ http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19/linux-headers-4.19.0-041900-generic_4.19.0-041900.201810221809_amd64.deb \\ http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19/linux-headers-4.19.0-041900-lowlatency_4.19.0-041900.201810221809_amd64.deb \\ http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19/linux-image-unsigned-4.19.0-041900-generic_4.19.0-041900.201810221809_amd64.deb \\ http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19/linux-image-unsigned-4.19.0-041900-lowlatency_4.19.0-041900.201810221809_amd64.deb \\ http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19/linux-modules-4.19.0-041900-generic_4.19.0-041900.201810221809_amd64.deb \\ http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19/linux-modules-4.19.0-041900-lowlatency_4.19.0-041900.201810221809_amd64.deb

インストールの途中で、
wget : ホストアドレス '\\' を解決できませんでした・・・ などの表示が出るが、そのまま実行を続ける・・・ 
8分24秒かかって終了。

この処理が終わった後、まだ再起動せず、URLにあるように下記のコマンドを打ち込む。

$ sudo dpkg -i *.deb
を実行して・・・ 途中 ERROR 表示はあるが・・・ 完了。

その後、再起動!
$ sudo reboot 

リブート後、 早速、カーネルバージョンの確認
$ uname -r 
と打ち込み、 4.19.0-041900-lowlatency  と表示された。

早速、Archer T1U v2 AC450 を USBポートに差し込んで WiFi 接続を確認した。

WiFiネットワーク( MediaTek WiFi )
インターフェース: 802.11 Wi-Fi
ドライバー: mt76x0
速度: 120~150Mb/s   (私が使っているWiFiルーターは、 AirStation WSR-2533DHP2 仕様では、5GHz帯接続時は最大1733Mbps となっている。電波状態は良いはずなので、AC450 は、規格値の 433Mbps にもっと近づいた値を示しても良いはずなんだが・・・)

比較のためのデータを書いておくと、
実は、Archer T1U v2 AC450 を購入して試すも、全く繋がらないので、諦めて Buffalo 無線LAN子機 WI-U2-433DMS を追加購入して、MacBook Pro で試していた。
その結果、kernel のアップデートも必要なく、USBポートに挿し込んで、Linux Mint 19.1 で無調整で、すぐに使うことが出来た。
その状態での速度は、 434Mb/s と表示されている。

ドングルの形が小さいArcher T1U v2 AC450 を気に入って購入したが、MacBook Pro 内臓のWiFi でも 270Mb/s の速度は出てくれる。
Buffalo 無線LAN子機 WI-U2-433DMS の方がいいなぁ。 僕は、ちょっと無駄な買い物をしてしまったような気がする。

注意
kernel を 4.19 にアップデート後、僕のMacBook Pro は、システムが不安定になった。
デスクトップ画面で作業中、「画面が黒字の ログイン画面に切り替わる」これは頻繁に発生する。画面は数秒で元に戻る。WiFi通信が頻繁に切れる。
これらの事を容認できないなら、カーネルのアップデートは、公式にサポートされるまでは、やめた方が良いと思う。 僕はこれから、 Linux Mint を再度クリーンインストールしようとしているところだから・・・。

04/28/2019

Linux Mint 19.1 MATE update Error bionic-security/restricted armhf Packages

最近、Linux Mint をアップデートする際、常に
 ... ubuntu bionic-security/restricted armhf Packages 404 Not Found ... と表示される。

加えて、
 ... ubuntu bionic InRelease がアーキテクチャ 'armul' をサポートしないため設定ファイル 'main/binary-armel/Packages' の取得をスキップ

などのエラーも表示される。「armhf」「armul」に関するエラー表示のようだ。

多分、いろいろやっている間に、余計なPackageをインストールしまったらしい。

ネットで調べてみると、下記の方法で修復出来ることがわかった。
ターミナルから次の 2行のコマンドを打ち込んでやればいい。

 sudo dpkg --remove-architecture armhf 
 sudo dpkg --remove-architecture armul

その後、 sudo apt update   として確認した。

ようやくアップデート時のエラー表示が消えた!


その後、アップグレード出来るパッケージが有ると表示されたので・・・アップグレードすることにした。

先ず、アップグレード出来るパッケージを表示する(だけ)の方法は、下記コマンドを打ち込めば良い。

 apt list --upgradable 

幾つかのアップグレード出来るパッケージが表示されたので、下記を打ち込んでアップグレードした。

 sudo apt upgrade

アップグレード後の確認は、  sudo apt update 問題なくアップデートされた。

04/14/2019

Linux Mint 19.1 MATE に Internet Security ソフト「COMODO」を入れる

Comodo Antivirus for Linux のサイトを開き、 ページの下部のボタンを設定して、
「Ubuntu」と表示されているボタンをクリックして、リストを表示して「Mint」を選択する。
そして右側の64bit を選び、 「FREE DOWNLOAD」をクリックする。

Downloads フォルダーに「cav-linux_x64.deb」がダウンロードされる。
 ターミナル端末を起動して、
cd /tmp && wget http://download.comodo.com/cis/download/installs/linux/cav-linux_x64.deb && sudo dpkg -i cav-linux_x64.deb
実行したら、
パスワードを入力し・・・
処理が終わったが、処理中にエラーが発生
cav-linux 

それで、libssl0.9.8 を、ダウンロードしオプション無しで下記のようにして実行します。
sudo gdebi-gtk libssl0.9.8_0.9.8o-7ubuntu3.2_amd64.deb
しかし、これを入力したら、依存関係が壊れていると表示され、” sudo apt-get install -f ” を実行するようにと書かれている。
早速、
sudo apt-get install -f
を実行する。

cav-linux (1.1.268025-1) を削除しています ...
Uninstallation succeed!
と表示されたので、次のステップに進む。

それで、再度 libssl0.9.8_0.9.8o-7ubuntu3.2_amd64 を実行する。
cd ~/Downloads
sudo gdebi-gtk libssl0.9.8_0.9.8o-7ubuntu3.2_amd64.deb 
を実行する。

パッケージインストーラ「libssl0.9.8」の窓が開く。右下に有る「パッケージをインストール」ボタンをクリックする。
《注意》OSを入れ直したので、このプロセスを再度行ったのですが・・・この部分に到達できない!
    原因は不明の状態。(2019/5/8)

何度かトライアルしていたため、「パッケージの再インストール」と表示されたらOKなので、「x」で窓を閉じて、
再度、cav のインストール
sudo dpkg -i cav-linux_x64.deb

未だ、終わっていません、ここからセットアップを行う。
sudo /opt/COMODO/post_setup.sh
「Enter」キーを押すように指示されるので・・・しばらくの間「Enter」キーを押し続けて・・・
コマンド表示になったら、次のコマンドを実行する。

以上で、アプリケーションの中に「COMODO」がインストールされた。

ここからは、Menu >> アプリケーション(COMODO) から設定作業を行う。
Menu >> アプリケーション(COMODO) を選択してクリック(実行)

Antivirus タグ の Update Virus Database をクリックして Virus Database を Update する。

Scheduled Scansをクリックして、スケジュール設定を行う。
「Edit」ボタンをクリックして、実行する曜日、時間帯を設定します。
「Apply」ボタンを押して設定終了。

Scanner Settings をクリックして、
Real Time Scanningタグから
Automatically quarantine threats found during scanning  にチェック[x]を入れておきます。
「OK」ボタンをクリックして設定終了。
次に、Scheduled Scanningタグから
Automatically quarantine ・・・ にチェック[x]を入れておきます。
「OK」ボタンをクリックして設定終了。

Summaryのタグに戻って、 Scan Now をクリックします。
次の画面で、「Scan」ボタンをクリックする。 次の添付画像のようにScanningが行われる。

Scanning-my-computer_001


《参考にしたブログ》
・ 221B Baker Street 「Linux Mint 18: 「Comodo Antivirus for Linux」のインストール

«Linux Mint 19.1 (MacBook Pro) に Bluetooth mouse を接続

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

無料ブログはココログ