酒と薔薇の日々(その2)

好きなことだけ求めて生きるアスペ気味のINTJ人

Aliex OLED SSD1306 128*32)のテスト

2023年10月20日 14時50分18秒 | マイコン(ESP32・Arduino等)

先日到着したAliExからのパッケージ中、OLEDをテスト 161円

0.91 inch OLED module 128*32 IIC通信版 青
ピンヘッダは最初からハンダ付けされていた。

I2C通信アドレスは「0x3C」だが「0x3D」に変更も可能(参考サイト2

制御が「SSD1306」というチップで成されているようで、このドライバをAdafruitから入手する。
動作電源は3.3Vで通信も3.3Vベース
なので本来はレベル変換が必要らしいのだが、ネット記事では直結してる・・・

ちなみに「adafruit」は「エイダフルーツ」で、由来は計算機の始祖「Ada」さんだそうです。

ライブラリを「SSD1306」で検索
①Adafruitの名前を冠したものをインストール
関連するライブラリを入れるか聞いてくるので②「全てをインストール」する。

サンプルから「Adafruit SSD1306」「ssd1306_128x32_i2c」を選ぶ。

配線は3.3V,GND、SDAはA4ピン、SCK(SCL)はA5ピンへ。
(SCLとSCKは同じ意味でクロック線を意味する。)

前回の128*64のOLEDは表示がバッグっていたが、今回は無問題です。
あっさりと動いてる。
前回のアズリ方を考えると、なんか拍子抜け。  

参考サイト(基本)    参考サイト2(文字表示詳細・ATOM例) 参考サイト3

本日朝からダルいし喉は痛いし、鼻血が出るし・・・ボラ休みます。

サンプル・ソースを読んでおまとめしてみた。
参考サイト2 display.drawFastHLine(x, y, 長さ, 色); で、水平垂直線が引けるそうです。

#include "SPI.h"
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library. 
// On an arduino UNO:       A4(SDA), A5(SCL)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {   // デバイス確認
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.display();
  display.clearDisplay();

  display.drawPixel(10, 10, SSD1306_WHITE);  // 画面バッファに点を打つ
  display.display(); // 表示

  testdrawchar();      // 標準フォントで文字表示
     :
     :
}

void loop() {
}

===========各サブルーチンから抜粋==============
//  文字描画(標準フォント)
    display.setTextSize(1);      // Normal 1:1 pixel scale
    display.setTextColor(SSD1306_WHITE); // Draw white text
    display.setCursor(0, 0);     // Start at top-left corner
    display.cp437(true);         // Use full 256 char 'Code Page 437' font
    // 全てのキャラクタ表示
    for(int16_t i=0; i<256; i++) {
      if(i == '\n') display.write(' ');
      else   display.write(i);
  }
//  装飾文字表示
  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(0,0);             // Start at top-left corner
  display.println(F("Hello, world!"));

  display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // 文字反転
  display.println(3.141592);

  display.setTextSize(2);             // 2倍体
  display.setTextColor(SSD1306_WHITE);
  display.print(F("0x")); display.println(0xDEADBEEF, HEX);

// スクロール
  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 0);
  display.println(F("scroll"));

  display.startscrollright(0x00, 0x0F);         delay(2000);
  display.stopscroll();                                  delay(1000);
  display.startscrollleft(0x00, 0x0F);            delay(2000);
  display.stopscroll();                                   delay(1000);
  display.startscrolldiagright(0x00, 0x07);  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);    delay(2000);
  display.stopscroll();                                  delay(1000);

// 線を引く
    display.drawLine(0, 0, i, display.height()-1, SSD1306_WHITE);
    // display.width()

// 矩形(Fill)  
    display.drawRect(i, i, display.width()-2*i, display.height()-2*i, SSD1306_WHITE);
    display.fillRect    (i, i, display.width()-i*2, display.height()-i*2, SSD1306_INVERSE);

// 円(Fill)
    display.drawCircle(display.width()/2, display.height()/2, i, SSD1306_WHITE);
    display.fillCircle(display.width() / 2, display.height() / 2, i, SSD1306_INVERSE);

// 角丸矩形(Fill)
    display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,display.height()/4, SSD1306_WHITE);
    display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,display.height()/4, SSD1306_INVERSE);

// 三角形(Filll)
    display.drawTriangle(
      display.width()/2  , display.height()/2-i,
      display.width()/2-i, display.height()/2+i,
      display.width()/2+i, display.height()/2+i, SSD1306_WHITE);
    display.fillTriangle(・・・);

// BitMap描画
  #define LOGO_HEIGHT   16
  #define LOGO_WIDTH    16
  static const unsigned char PROGMEM logo_bmp[] =
  { 0b00000000, 0b11000000,
    0b00000001, 0b11000000,
        : 
   0b00000000, 0b00110000 };
   ------
  display.clearDisplay();
  display.drawBitmap(
    (display.width()  - LOGO_WIDTH ) / 2,
    (display.height() - LOGO_HEIGHT) / 2,
    logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
  display.display();

// bitmapアニメーション
  icons[][]の二次元配列に位置情報を生成し、
  icons[][]に沿ってdrowbitmapし、
 1画面完成したらdisplay.display();している
  底づきしたら新たな場所を生成しているようです。

 


Aliex シリアルLED(WS2812B)のテスト

2023年10月20日 10時23分16秒 | マイコン(ESP32・Arduino等)

先日到着したAliExからのパッケージ中、シリアルLED8連を試験 (1本50円)

ポイント
 ソース内デバイス名の指定は NEO_GRB + NEO_KHZ800 を記述する。(WS2812Bの場合)
 明るさセット:pixels.setBrightness(x);  // 0..255 255を超えると0にリセットされるようです
 明るさ取得: Serial.println(pixels.getBrightness());
注意点:
 パネルにはデータが進む向きがあって、DI(DataIn)へarduinoのデータピンを繋ぎます。

 DO(DataOut)ではないよ。

パネルには直接Pinをハンダ付けした。
高さと水平整合性をちゃんと取ってからハンダ付けします。これ重要
パネルには予め予備ハンダされているのかすんなりハンダが乗る。

上記写真は電源ラインを別系統から取っています。
ArduinoからはGNDと信号線を与えます。GNDとは電源と共通にする。
8*8マトリックス全部を一斉に白点灯すると12.6mAが流れるそう。
今回の8個程度では3mA以下のはずなので無問題と思う。
電源や回路詳細は  マルツオンラインからの情報

流れるLEDのサンプルソースはこちらからいただきました。
かなり明るいので電流オーバーになりそうで怖かったけどそうでもないようだ。
このLEDは鮮やかで明るいですね。
delayが100ms入ってると流れるようだが、0にすると全白表示となる。
手持ちならバーサライタもできそうです。

本日夕方からボラなので持って行って見せたくなってきた。

取り敢えず動きましたが、ちょっとひと悶着あったのでした。
サンプルはページの最後に

GitHubにあった関数リファレンス

NeoPixcelsのGitHubから
ライブラリの機能一覧
Functions
    begin()
    updateLength()
    updateType()
    show()
    delay_ns()
    setPin()
    setPixelColor()
    fill()
    ColorHSV()
    getPixelColor()
    setBrightness()    0..255
    getBrightness()
    clear()
    gamma32()

----経過-----

実は昨晩ハンダ付けしたのだが頭と目が悪いので、DOutにデータ線を結んでしまっていた。
うんともすんとも言わない状態になってた。
あまりにもおかしいので、つまらんミスがあるんだと一晩寝ることにした。

やはり夜明けにデジタル神様が降臨し「これこれ、データを流す向きが間違ってないのか?」と。
昨晩参照したサイトの「結線した場所が一番最初に光るLED」という記述を誤解してたことに夢うつつで気がついた。
( °o°)ハッ
シリアル通信で1個ごとにデータを取り去り、次のLEDに伝えるには入と出があるはずだし、
LEDのチップ中のマイコンも、入力ラインをInputモードにして待ち続けるわけだから、
逆のDOutに接続してしまえば制御データを読めるはずもない。
ボードをよく見ると確かに「DO」「DI」の2種類の印刷が・・
馬鹿ですね。

実は昨晩からシリアルLEDを点ける前哨戦で、まずはArduino「Wokui」エミュでやってみた。
これは別記事で。

//--------赤1個だけ点灯----------------------

#include "Adafruit_NeoPixel.h"
const int DIN_PIN = 11; // D11
const int LED_COUNT = 8; // LEDの数

Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);  // 赤文字は重要 このデバイス特有です。

void setup() {
  pixels.begin();
}

void loop() {
  pixels.clear();
  pixels.setPixelColor(0, pixels.Color(255, 0, 0)); // 0番目の色を赤に変える
  pixels.show();
}

=======流れる虹(走る火の玉)================

Arai様 パクらせていただきました。m(_ _)m

/*
  Created by Toshihiko Arai.
  https://101010.fun/iot/arduino-serial-led.html
*/

#include "Adafruit_NeoPixel.h"

const int DIN_PIN = 11; // D11
const int LED_COUNT = 8; // LEDの数

Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
/*
uint32_t red = pixels.Color(128, 0, 0);
uint32_t orange = pixels.Color(128, 82, 0);
uint32_t yellow = pixels.Color(128, 128, 0);
uint32_t green = pixels.Color(0, 128, 0);
uint32_t cyan = pixels.Color(0, 128, 128);
uint32_t blue = pixels.Color(0, 0, 128);
uint32_t purple = pixels.Color(128, 0, 128);
*/
uint32_t red       = pixels.Color(128,0,0);
uint32_t orange = pixels.Color( 64,0,0);
uint32_t yellow  = pixels.Color( 32,0,0);
uint32_t green   = pixels.Color(  0,0,0);
uint32_t cyan     = pixels.Color(  0,0,0);
uint32_t blue     = pixels.Color(  0,0,0);
uint32_t purple = pixels.Color(  0,0,0);

uint32_t rainbow_color[] = {red, orange, yellow, green, cyan, blue, purple};
int rainbow_index[] = {6, 5, 4, 3, 2, 1, 0};

void dsp_index(){
  for (int i=0;i<7; i++){
    Serial.print(rainbow_index[i]);Serial.write(' ');
  }
  Serial.println(' ');
  //delay(2000);
}

void clear_index(){
  for(int j = 0; j < 7; j++) {
      rainbow_index[j] = 0;
  }  
}

void setup() {
  pixels.begin();
  Serial.begin(9600);
  Serial.println("hello Neo Pixcel");
  pixels.setBrightness(20);
  delay(3000);
}

void loop() {
  for(int i = 0; i < LED_COUNT; i++) {    
    pixels.clear();    
    //Serial.println("-----start-----");
    for(int j = 0; j < 7; j++) {
      rainbow_index[j] = i + 6 - j;
      if(rainbow_index[j] >= LED_COUNT) rainbow_index[j] -= LED_COUNT;
      pixels.setPixelColor(rainbow_index[j], rainbow_color[j]);
      //dsp_index();
    }
    pixels.show();
    //Serial.println("result");
    //dsp_index();
    //clear_index();
    delay(50);
  }
}


WokuiのArduinoエミュレータ上でNeoPixcelを動かす(ライブラリ導入)

2023年10月19日 20時52分43秒 | マイコン(ESP32・Arduino等)

実はシリアルLEDを点ける前哨戦で、まずはArduino「Wokui」エミュでやってみることにした。
来年の講座でWokuiエミュを使う予定なので習熟しておかねばならないし、
同僚から「ライブラリインストールが有償」なんてガセ情報を掴まされかけてたから。

Arduino初期画面のパーツ挿入画面からリング状の「NeoPixcel」を選ぶ。

電源とデータラインを画面上で結線する。データラインは11番とした。
リアル決戦サンプルでは1番ピンとするネット記事があるが、エミュ上ではシリアルデータと勘違いされ、意味不明の通信データが画面右下へ表示されるため。

はいここで問題が発生。ライブラリが無いよと。

① 画面上部にある「Library Manager」タブをクリックする。
② 「+」ボタンをクリック
③ 「neopix」などと打ち込んでライブラリを探す。
上から2個のAdafruitライブラリがセットで必要のようです。

(多分)上側の「Adafruit DMA neopixcel library」をクリックするともう一個も自動で組み込まれたっポイ
「Sketch.ino」タブに戻る。

1個だけ赤で点灯するサンプルを動かしてみた。
LEDを数は16,ラインはD11にと変更
これらは、インストールと同時に入ってくるライブラリ・サンプルソースにも格納されている。

今度は7色の発光がぐるぐる回るサンプルをこちらの先達から頂いて、動かす。
ちゃんと動きました。

画面上でぐるぐるやっております。多分現物はもっと明るいはず。

=====サンプルソース=========

//--------------オレンジが回転---------------------
#include "Adafruit_NeoPixel.h"
const int DIN_PIN = 11; // D11
const int LED_COUNT = 16; // LEDの数

Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);  // 赤字部分は内蔵チップ固有の文字列です

void setup() {
  pixels.begin();
}

void loop() {
  for(int i=0; i<LED_COUNT; i++) {
    pixels.clear();
    pixels.setPixelColor(i, pixels.Color(255, 128, 0)); // orange
    pixels.show();
    delay(500);
  }
}


Aliex サーボテスタのテスト

2023年10月19日 19時32分06秒 | マイコン(ESP32・Arduino等)

先日到着したAliExからのパッケージ中、サーボモータのテスター(123円)を試験

ちゃんと動きましたが、流石にパッケージは紙状のプラでペコペコです。
ペコでも文句なんか言えない。いちいちテストプログラムを書き込んだarduinoを別途1個用意するのは面倒くさい。

左側の端子にサーボを3個まで同時接続可能
右側端子は電源で1ピンは未使用

起動後、上面の左下にあるSelectスイッチで動作モードを切替
モードは上側の3個のLEDで示される。
左:ポテンショメータの回転に合わせて90度程度サーボが回転する
中:ニュートラル位置でサーボが止まるんだそうです
右:延々とサーボが動くデモモード

10個あるサーボを動かしてみたが、前から故障と思っていた奴はやっぱり何か挙動がおかしかったり、動かなかったり。
今後サーボ系の工作が増えると思うので、一発判定できるのでありがたいですね。


チャリハンドルのクッション

2023年10月19日 15時42分30秒 | 自転車

しばらく前、100均で購入していた自転車ハンドルのクッション

はめようと思ったのだが・・・穴が小さすぎて全然入らん。
純正ラバーを取ればそりゃハマりますけど。
ちゅうことで、止むを得ず殻割り。

劣化して開ききるまでの役目と相成りました。
これで手が痛いのが少しは緩和されるかな。


奥深かったハンダ付け・・

2023年10月18日 20時50分04秒 | ちょっとした工作とか

Twitter(X)でたまたまナイフ形のコテ先の記事を見た。
先日ハンダ付けで苦労していたのでマジで記事を探してみた。
こちらを読んでみた。
いやいや奥深い世界がそこにはあったのだ。
なんとハンダ付けのDVDまで発売されているではないか!(Youtube出現前の製品かな?)

なかなか温まらなかったり、コテを妙に寝かせないとハンダが溶けなかったりとあれこれ困っていたが、
標準装備のペン型コテ先だったからなんだ・・・
そういうことだったのか。

まずはC型のコテ先に交換してみます。
amazonの合わせ買い候補に早速入れておきましたよ。

”ぷらぎあ”さん、ありがとう。

近所の知人にボラ現場まで用紙を持って行ってほしいとお願いに行ったら、逆に書きを3個もらいました。
表面が黒くなっておれば渋くはないんだって。


車泊お試しで近場で夜景を眺める

2023年10月17日 16時38分23秒 | 旅車改造

車泊改造も一段落したので涼しくなってきたこともあって近場へ出かけてみた。
実は親戚が入院中で万一の際家族の面倒を見なくてはならず、遠くへは行けないという制限があった。

午前中の神楽チケットゲットを終え、宿泊準備をし15時頃に家を出る。

広島湾反対側の坂の夜景が見える公園
駐車場が12台分ほどあった。

夕方は帰社前のサラリーマンや釣り人が集まる。
昔の暴走連中が集うようなことはなかった。
脇の堤をウオーキングする人が多い。

段々とくれていく。けっこう涼しい。

晩飯。醤油をもらうのを忘れたので何年も前から緊急用でストックした醤油を使用・・・味が少し変
アルコールを誤って買いすぎた。
昨日谷村新司が死去したというニュースが有り、ここへ来る最中たまたま彼のCDが架かったので、
一晩中スマホから彼の楽曲を流した。

彼の歌は好きなんだけど、悲しくなるような内容が多い。
”帰らざる日々”では涙が出るよ。

アップ 船で見に行くコースと違って迫力はあまりない。

メールに写真を添付中。良いテーブルであります。
100均300円のライトは使いやすいのだが、走行中どこへ固定するかが課題
足元の配線を束ねないとイケンです。
夜10時すぎまでアベックが近くで喋ってた。

翌日は、しない車泊場所を探して比治山へ寄ったり、横川の河川敷に行ったり(降りられなくなっていた)

比治山の環境は良いのだけど木が伸びすぎて見晴らしが悪い。
この公園は朝から老人が車で集っている。
椅子を出してしばし日向ぼっこ。少し昨晩は飲み過ぎ。
体重がドガッと増えました(悲)

最後はチャリンコでなぎさ公園を周回。ここも酒飲み車泊にはイマイチな景色

本日の昼飯。連日の寿司三昧でござる。
今回は忘れずわさびと醤油をもらいました。
エビコロッケ(?)はまずい。
いつも餌をねだってくるネコがカラスや鳩を狙っているのには驚いた。
鳥たちも馬鹿ではないのでヤラレはしませんw

6割りになるクッション
少し幅が大きく多少つっかえるがなかなかいい感じで一番奥へ収まる。
もう一個買いましょう。


雑事で暇をつぶす

2023年10月17日 10時38分23秒 | 日記

朝イチ、友人の神楽チケットをゲットのため佐伯区図書館へ出かけた。
9時開館なんで少し早めに行ったがすでに駐車場は開いておった。

車を動かしてたりしてる内に3名ほど間に入ったが33番目
噂では朝6時から並んでたそうな。
10時から販売で15分でチケットゲット
直前の人が最後に残った通路脇の席をゲットしたのは悔しかった。
ま、通路に近いので許してもらいまひょ。

6時間で指定席が2000円と格安
とはいえ私は好きでもないので苦痛、参加は遠慮させてもらいます。

昨晩依頼の電卓を修理するも埒が明かず。
何をやってもオーバーフローで加減算ができない。
チップが壊れてる。


久々の感動(旨い)

2023年10月15日 19時17分53秒 | 日記

かんどうしたっ!


AliExからお荷物到着

2023年10月15日 14時21分09秒 | マイコン(ESP32・Arduino等)

9月28日深夜注文したAliExの荷物が予定通りプログラムったりの9/15に届いた。

インジケーター付きの再チェックサーボテスター ¥118 x 1
Tzt-oled Displayモジュール ¥158 x 1
TZT デュポンライン 120PCS X1 set 20CM ¥ 376 x 1
Rgb ledランプモジュール 8Bit Rectangular ¥ 50 x 3
送料が206円で合計1026円

どれもこれも物欲的には中途半端な物件なんだがメインはRGBバーが欲しかったから。
国内では売っていないし8セルで50円と格安
バーサライタを作ろうかと思うて。

腕時計のLCDは興味から。これも安い。
ケーブルは前回格安品に怒って全部捨ててしまったが、講座の際に必要になるかと思い直した。
送料1000円以上の為に追加したようなもん。
粗悪品確実だろうから、間違って自分の実験では決して使わないようにと黒スプレーでマークを付けておいた。

忙しくてテストしてる暇がない・・
どうせ不良品があっても大陸まで返品なんてできねぇからそれでよし。