goo blog サービス終了のお知らせ 

JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

Arduino UNO R4 (WiFi) 2.2" TFT表示テスト

2024-06-04 20:46:06 | Arduino
 Arduino UNO R4 WiFiで2.2インチTFTの表示テストをします。

 2.2インチTFTは3.3V系のデバイスなので、次の回路図ように電圧変換モジュールFXMA108を間に入れて接続します。(抵抗で分圧する方法もあります)


 Arduino Pro Miniで既に表示テストをしています。その記事は、JH7UBCホームページのこちらの記事です。

 Arduino UNO R4(WiFi)に接続する前にArduino UNO R3でテストをしました。
 まず、ライブラリ管理で必要なライブラリAdafruit_ILI9341.hとAdafruit_GFX.hをインストールします。

 次に、ファイル→スケッチ例→Adafruit ILI9341と進み、graphicstestを読み込みます。

 このままでは動きませんので、スケッチを次のように修正します。
 (赤字の部分を加えます

 // For the Adafruit shield, these are the default.
#define TFT_RST 8 // 追加
#define TFT_DC 9
#define TFT_CS 10

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

 これでR3にコンパイル書き込みをしました。グラフィックが表示されたあと文字が表示され、90°ずつ回転して表示されました。



 次に、R3をR4 WiFiに交換してテストをしました。

 ところが、同じスケッチをコンパイルすると「wiring_private.h」というファイルがありませんというエラーメッセージがでてNGでした。

 解決法をネットで探すとAdafruiteのサイトのForumsに解決策を書いた記事がありました。記事はこちら

 ドキュメント内のArduinoフォルダにあるlibrarisフォルダ内のAdafruite_ILI9341フォルダにあるAdafruite_ILI9341.cppをエディタ(メモ帳)などで次のように書き換え保存します。

52-54行目の次の部分を

#ifndef RASPI
#include "wiring_private.h"
#endif

次のように変更します。

#if defined(__has_include)
#if __has_include("wiring_private.h")
#include "wiring_private.h"
#endif // __has_include("wiring_private.h")
#else //defined(__has_include)
#include "wiring_private.h"
#endif //defined(__has_include)

 私は、上の3行を//でコメントアウトして下の6行をコピペしました。

 以上の変更を行った結果エラーがでなくなり、コンパイル書き込みしたら、うまく表示されました。めでたし、めでたし。


 表示速度は、やはりR4の方が速いです。

 それにしてもR3とR4は別物ですね。

Arduino UNO R4 (WiFi) OLEDテスト その2

2024-05-29 17:38:43 | Arduino
 前の記事に続き、Arduino UNO R4 WiFi でOLEDに文字を表示するテストをします。

 Zennというサイトにあるデモプログラムにのスケッチの文字表示の部分だけを取り出しました。
--------------------------------------------------------------------
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

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

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(115200);

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  //display.display();
  //delay(2000); // Pause for 2 seconds

  // Clear the buffer
  display.clearDisplay();

  display.setTextSize(1);      // Normal 1:1 pixel scale
  display.setTextColor(WHITE); // Draw white text
  display.setCursor(0, 0);     // Start at top-left corner
  display.cp437(true);         // Use full 256 char 'Code Page 437' font

  // Not all the characters will fit on the display. This is normal.
  // Library will draw what it can and the rest will be clipped.
for(int16_t i=0; i<256; i++) {
    if(i == '\n') display.write(' ');
    else          display.write(i);
  }
  display.display();
delay(2000);
  display.clearDisplay();

  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(WHITE);        // Draw white text
  display.setCursor(0,0);             // Start at top-left corner
  display.println(F("Hello, world!"));

  display.setCursor(0,20);
  display.setTextColor(BLACK, WHITE); // Draw 'inverse' text
  display.println(3.141592);

  display.setCursor(0,40);
  display.setTextSize(2);             // Draw 2X-scale text
  display.setTextColor(WHITE);
  display.print(F("0x")); display.println(0xDEADBEEF, HEX);

  display.display();

}

void loop() {

}
--------------------------------------------------------------------
 最初にこのように文字が表示されます。


display.write(i);によってasciiコードの対応する文字を表示することができます。

 2秒後に次のような画面になります。


 文字サイズ1で「Hello, World!」が表示されます。

 次に反転文字で数字3.141592を表示するわけですが、3.14までしか表示されません。

 最後に、文字サイズ2で、HEX表示をしています。

 display.print()またはdisplay.println()で、書式を指定して文字を表示するようです。

Arduino UNO R4 (WiFi) OLED テスト その1

2024-05-28 19:45:28 | Arduino
 今日は一日中雨降りでした。晴耕雨読。今日は家庭菜園は休みです。久しぶりにArduino UNO R4 WiFiを引っ張り出してきてOLEDの表示テストをしました。

 Arduino UNO R3でテストしたスケッチでやってみると、このチップでは使えませんというメッセージが出てNGでした。

 ネット上を探すとArduino UNO R4でのOLEDの表示例がありました。ZennというサイトでZenn記事は、こちら。この記事を参考にしてサンプルプログラムを書き込んでみるとデモが表示されました。

 まず、Arduino IDE(私はver 2.3.2を使っています)を立ち上げ、ライブラリマネージャで必要なライブラリ
Adafruit GFX Library by Adafruit
Adafruit SSD1306 by Adafruit 
をインストールします。

 この後、スケッチ例「ssd1306_128x64_i2c.ino」をコンパイル書き込みしてみましたが何も表示されませんでした。原因はよくわかりません。

 ということで、Zennというサイトに掲載されているスケッチを元にして、OLEDの表示テストをしました。Arduino UNO R4(WiFi)とOLED(128x64)の接続回路図です。



 まず、グラフィック関係の表示テストをしました。点、線、四角形、丸、三角、角が丸い四角などを描くことができます。
 テストしたスケッチです。サンプルから必要な部分を抜き出しました。
 bufferに図形を描き、display.display();でOLEDに画面を転送しています。

-----------------------------------------------------------------
/*
Arduino UNO R4 OLED test
2024.5.28
JH7UBC Keiji Hata
*/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

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

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
Serial.begin(115200);

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
}

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  //display.display();
  //delay(2000); // Pause for 2 seconds

  // Clear the buffer
display.clearDisplay();

  // Draw a single pixel
display.drawPixel(10, 10, WHITE);
display.display();
delay(100);

  //Draw line
display.drawLine(30, 10, 50, 30, WHITE);
display.display();
delay(100);

  //Draw rectangle
display.drawRect(60,10,20,20,WHITE);
display.display();
delay(100);

  //Drw fillrectangle
display.fillRect(90,10,20,20,WHITE);
display.display();
delay(100);

  //Draw circle
display.drawCircle(10,50,10,WHITE);
display.display();
delay(100);

  // Draw fillcircle
display.fillCircle(40,50,10,WHITE);
display.display();
delay(100);

  //Draw triangle
display.drawTriangle(70,40,60,60,80,60,WHITE);
display.display();
delay(100);

  //Draw roundrectangle
display.drawRoundRect(90,40,20,20,3,WHITE);
display.display();
delay(100);
}

void loop() {
}
-----------------------------------------------------------------

 Arduino UNO R4 WiFiとOLEDの接続の様子です。OLEDは秋月電子から購入したものです。


 表示結果です。


 次回は、文字を表示してみます。

Arduino UNO R4 (WiFi) OPAMP テスト

2024-03-06 13:04:29 | Arduino
 Arduino UNO R4(WiFi)は、オペアンプを内蔵していますので、その使い方の勉強をします。「それやってみよう」というサイトのこちらのページとArduino チュートリアルのこちらのページを参照しました。

 Arduino UNO R4(WiFi)は、4個のオペアンプを持っていますが、実際にすぐ使えるのは1つ(OPAMP0)で、入出力は、アナログピンに次のように割り当てられています。
OPAMP0 input+ = A1
OPAMP0 input- = A2
OPAMP0 output = A3
 このオペアンプを使って、ボルテージフォロアと非反転増幅のテストをします。
 

 まず、ボルテージフォロアのテストをします。
 DACの出力(A0)をOPAMP INPUT+に接続します。OPAMP output(A3)をOPAMP input-(A2)に接続します。DACにオペアンプを接続することにより、低い出力インピーダンスで安定して電圧を取り出すことができます。

 スケッチです。
-------------------------------------------
#include <OPAMP.h>

void setup() {
OPAMP.begin(OPAMP_SPEED_LOWSPEED);
analogWriteResolution(12);
analogWrite(DAC,1023);
}

void loop() {
}
-------------------------------------------
 このスケッチでDACから1.19Vが出力されます。



 ボルテージフォロアを通した電圧です。1.19Vと変わりません。


 次に、オぺアンプの配線を非反転増幅に変えて、テストします。
 R1=10kΩ、R2=20kΩとして、増幅率3倍の非反転増幅器としてオペアンプの出力電圧を測定してみました。3倍の電圧が出力されました。OKです。


 以前、DACのテストで行った鋸歯状波をオペアンプのボルテージフォロアを通して出力させてみました。
 スケッチです。OPAMPのスピードはHIGHとしました。
 ちなみに、帯域幅は、LOWSPEEDのとき低電力で40KHzまで、HIGHSPEEDは1.7MHzまで
-----------------------------------------------------
#include <OPAMP.h>

void setup() {
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
analogWriteResolution(10);
}

void loop() {
for(int i=0;i<1024;i++ ){
analogWrite(DAC,i);
}
}
-----------------------------------------------------
 観測されたオペアンプの出力波形です。
 オペアンプがないときに比べギザギザが少なくなっています。



Arduino UNO R4 (WiFi) MAX7219 8X7segLEDテスト(再)

2024-03-04 19:23:20 | Arduino
 前の記事でArduino UNO R4(WiFi)でのSPIのテストをしました。それを元に以前Arduino UNO R3でMAX7219 8X7segLEDのテストに使ったスケッチを書き替えてみました。

 配線図です。



 スケッチです。元記事はこちら
--------------------------------------------------------
/*
* Arduino UNO R4 WiFi MAX2719 8X7segLED test
* 2024.03.04
* JH7UBC Keiji Hata
*/

#include <SPI.h>
SPISettings spi_setting(1000000, MSBFIRST, SPI_MODE3);
#define CS_PIN 10
//CLK PIN13
//DIN PIN11

// MAX7219 Register Address
#define MAX7219_DECODE_MODE 0x09
#define MAX7219_INTENSITY 0x0a
#define MAX7219_SCAN_LIMIT 0x0b
#define MAX7219_SHUTDOWN 0x0C
#define MAX7219_DISPLAY_TEST 0x0f

void maxTransfer(uint8_t address, uint8_t value) {
digitalWrite(CS_PIN, LOW); // Start transfer.
SPI.transfer(address); // Send address.
SPI.transfer(value); // Send the value.
digitalWrite(CS_PIN, HIGH); // Finish transfer.
}

void MAX7219_INI(){
maxTransfer(MAX7219_DECODE_MODE, 0xff);// Code B decode for digits 7–0
maxTransfer(MAX7219_INTENSITY, 0x03); // Use lowest intensity.
maxTransfer(MAX7219_SCAN_LIMIT, 0x07);// Display digits 01234567
maxTransfer(MAX7219_SHUTDOWN, 0x01);// Normal Operation
maxTransfer(MAX7219_DISPLAY_TEST, 0x00);// Normal Operation
}

void Clear_Display(){
for(uint8_t i=1;i<=8;i++){
maxTransfer(i,0x0f);
}
}

//x=表示開始digit(digit7-0)、nl=数値の最大長、num=表示する数値
//数値は右詰めで表示する
void printnum(uint8_t x,uint8_t nl,uint16_t num){
String s=String(num); //数値を文字列に変換
uint8_t ln=s.length();//文字列の長さ
int ix=ln-nl; //index初期値
uint8_t sx=x+1; //表示開始アドレス

for(uint8_t i=0;i<nl;i++){
int index=ix+i;
if(index<0){
maxTransfer(sx-i,0x0f);
}else{
String c=s.substring(index,index+1);//indexの文字を1個取り出す
uint8_t m = c.toInt();//文字列を数値に変換
maxTransfer(sx-i,m);
}
}
}

void setup() {
pinMode(CS_PIN, OUTPUT); // CS_Pin is OUTPUT Mode
digitalWrite(CS_PIN, HIGH); // CS=HIGH
SPI.begin(); // Start SPI
SPI.beginTransaction(spi_setting);
MAX7219_INI();
Clear_Display();
}

void loop() {
for(uint16_t i=0;i<10000;i++){
printnum(5,4,i);
delay(500);
}
}
--------------------------------------------------------

  数字がカウントアップされて表示されました。