Enjoy programming more!
Kidspod is a post site which supports young programmers.
First step to join us.
Register as a member
For members

2020/11/24 19:25:57

MixJuice GET URL : kidspod.club/mj/1035

STM32F303k8 クリスマス OLED表示器

OLEDにクリスマスと表示する。

苦労した点
OLEDのライブラリのインストールに苦労した
使用したライブラリーは、

Dai YokotaさんのSSD1306_128x64_I2Cライブラリを使用した。
https://os.mbed.com/users/jk1lot/code/SSD1306_128x64_I2C/file/46dcbaa430f4/SSD1306.h/

ライブラリのインストール方法は、
mbedの画面のプロジェクトディレクトリー名の所で右クリックして
新しいライブラリー...を選択してOLED検索画面からDai Yokotaを選択
する。

アドレスは、0x3c
初期化は、
I2C i2c(I2C_SDA, I2C_SCL)
SSD1306 oled(i2c, ADDR);
表示は、
oled.writeString(0, 0, "Hello World !")


取り合えず現在は、5ビット 32文字です。

7ビット用に改良
オートビットレートで平均約33msで7ビット読めた。
プログラム メモリーサイズ 約40kバイトで
lpc812,stm32l010,stm32g031,stm32f042では動かない
64kバイト積んでいるf303でしか動かない。

秋月のはうまくいかない。!!古い2020/12/9
有機ELディスプレイ 128쎗32 白色
[AL12832AWWB-H-U02]
通販コード P-14686
発売日 2020/03/07
600円のやつ

内容が古い>
//ardiuno ide 1.8.11にSTM32 Corasをインストール
//u8g2ライブラリーをインストール
//U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ //U8X8_PIN_NONE); // Adafruit ESP8266/32u4/ARM Boards + FeatherWing //OLED
//を選択
//ソースの例からHelloWorldを選択
//3.3Vを5Vに変換する為にPFMステップアップDC/DCコンバーター HT7750A(5個入)とコンデンサー2個とコイルとダイオードを使用した。
//マイコンは、STM32 Nucleo Board STM32F303K8
<内容が古い

void char11(int row,int com,int cha)と言う関数を作って力技で解決した。
よつて秋月の128x23のOLEDで表示出来るようにした。


!!更新中!!

  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

SOURCE CODE

!!!更新中!!!

stm32f303k8 mbed側のプログラム あいてんどうの128x64のoled

#include "mbed.h"
#include "SSD1306.h"

DigitalOut myled(LED1);

DigitalIn myin9(PF_1);     // for out 11 (in4) (303 D8)

#define ADDR     (0x3c<<1) //  address
//#define ADDR     (0x3d<<1) //  address
 
I2C i2c(I2C_SDA, I2C_SCL);

// Host PC Communication channels
Serial pc(USBTX, USBRX); // tx, rx

// Instantiate OLED
SSD1306 oled(i2c, ADDR);

int main() {
    
    int a;
    int b;
    int c;
    int d;
    int e; //5bit
    int f; //6bit
    int g; //7bit
    char s[2] = {'@',0};
    
    int tl_f;
    int tls;
    int tl;
    
    int cursor1;
    
    pc.baud(9600);
    
    myin9.mode( PullUp );   //  内蔵プルアップを使う

    //  oled.writeString(0, 0, 13, "Hello World !");
    oled.writeString(0, 0, "Hello World !");  
    pc.printf("Printed something\r");    
    wait(3);
    //                      1234567890123456
    oled.writeString(0, 0, "@               ");

    e=0;f=0;g=0;

    tl = 33; //シリアル 1ビットの長さ
    cursor1 = 0;    
    while(1) {
        tl_f = 0;tls=33;
        while( myin9 == 1 ) {}  
        for(int loop_i=1;loop_i <= 33;loop_i++){
            wait_ms(1);if(myin9 == 1 && tl_f == 0){tl_f=1;tls=loop_i*2;}
        }
        if(tl_f == 1) {tl = tls - 1;} // スタートビット目の次が1の場合と調整
        //wait_ms(tl); //debug
        a=!(myin9);   // 1bit
        wait_ms(tl);
        b=!(myin9);   // 2bit
        wait_ms(tl);
        c=!(myin9);   // 3bit
        wait_ms(tl);
        d=!(myin9);   // 4bit 16
        wait_ms(tl);
        
        e=!(myin9);    // 5bit 32
        wait_ms(tl);
        f=!(myin9);    // 6bit 64
        wait_ms(tl);
        g=!(myin9);    // 6bit 64
        wait_ms(tl);


        //a=0; // debug
        s[0]=g*64+f*32+e*16+d*8+c*4+b*2+a;
        
        if( s[0]=='_' ) {
            //画面クリア
            //                      1234567890123456
            oled.writeString(0, 0, "                ");
            //カーソルのクリア
            cursor1 = 0;
        } else {
            //文字の表示
            pc.printf(s);   
            //               y  x   
            oled.writeString(0, cursor1, s);
            cursor1++; 
 
            //debug          
            //s[0]='0'+(tl/10);oled.writeString(1, 0, s);
            //s[0]='0'+(tl%10);oled.writeString(1, 1, s);
 
            //debug
            //s[0]='0'+g;oled.writeString(2, 0, s);
            //s[0]='0'+f;oled.writeString(2, 1, s);
            //s[0]='0'+e;oled.writeString(2, 2, s);           
            //s[0]='0'+d;oled.writeString(2, 3, s);
            //s[0]='0'+c;oled.writeString(2, 4, s);
            //s[0]='0'+b;oled.writeString(2, 5, s);
            //s[0]='0'+a;oled.writeString(2, 6, s);
            
        }
        
        if(cursor1 >= 16) {
            //画面クリア
            //                      1234567890123456
            oled.writeString(0, 0, "                ");
            //カーソルのクリア
            cursor1 = 0;
        } //endif
        
        
        
        //myled = 1; // LED is ON
        //wait(0.2); // 200 ms
        //myled = 0; // LED is OFF
        //wait(0.2); // 1 sec
        
        //oled.writeString(0, 0, "Hello World !");  
        //pc.printf("Printed something\r");    
        //wait(3);
  
    }
}

ichigojam用
 
10 'START 0.5 DATA 7BIT SOTP 1
20 OUT 11,1:WAIT 15
30 [0]=ASC("C")
40 [1]=ASC("H")
50 [2]=ASC("R")
60 [3]=ASC("I")
70 [4]=ASC("S")
80 [5]=ASC("T")
90 [6]=ASC("M")
100 [7]=ASC("A")
110 [8]=ASC("S")
120 [9]=ASC("_")
160 FOR I=0 TO 9
170 R=[I]:GOSUB 200:WAIT 60
180 NEXT
190 GOTO 160
200 '
210 OUT 11,0:WAIT 1
220 FOR S=0 TO 6
230 OUT 11,!( (R >> S)&1 )
240 WAIT 2
250 NEXT
260 OUT 11,1
270 WAIT 2
280 RETURN



stm32f303k8 mbed側のプログラム 秋月の128x32のoled

#include "mbed.h"
#include "SSD1306.h"

#include "font_8x8.h"

DigitalOut myled(LED1);

DigitalIn myin9(PF_1);     // for out 11 (in4) (303 D8)

#define ADDR     (0x3c<<1) //  address
//#define ADDR     (0x3d<<1) //  address
 
I2C i2c(I2C_SDA, I2C_SCL);

// Host PC Communication channels
Serial pc(USBTX, USBRX); // tx, rx

// Instantiate OLED
SSD1306 oled(i2c, ADDR);

char ddff[8*8];

void char11(int row,int com,int cha)
{
    
    int char_index1;

    char_index1 = cha-0x20;

    int ii;
    
for (ii = 0;ii<(8*4);ii++) {ddff[ii]=0;}
for (ii =0;ii<8;ii++){
ddff[ii+ 0] = ddff[ii+ 0] | ((font_8x8[char_index1][ii] >> 0) & 1)<<1; //1bit  
ddff[ii+ 0] = ddff[ii+ 0] | ((font_8x8[char_index1][ii] >> 0) & 1)<<3; //1bit 
ddff[ii+ 0] = ddff[ii+ 0] | ((font_8x8[char_index1][ii] >> 1) & 1)<<5; //2bit  
ddff[ii+ 0] = ddff[ii+ 0] | ((font_8x8[char_index1][ii] >> 1) & 1)<<7; //2bit 
ddff[ii+ 8] = ddff[ii+ 8] | ((font_8x8[char_index1][ii] >> 2) & 1)<<1; //3bit  
ddff[ii+ 8] = ddff[ii+ 8] | ((font_8x8[char_index1][ii] >> 2) & 1)<<3; //3bit 
ddff[ii+ 8] = ddff[ii+ 8] | ((font_8x8[char_index1][ii] >> 3) & 1)<<5; //4bit  
ddff[ii+ 8] = ddff[ii+ 8] | ((font_8x8[char_index1][ii] >> 3) & 1)<<7; //4bit 
ddff[ii+16] = ddff[ii+16] | ((font_8x8[char_index1][ii] >> 4) & 1)<<1; //5bit  
ddff[ii+16] = ddff[ii+16] | ((font_8x8[char_index1][ii] >> 4) & 1)<<3; //5bit 
ddff[ii+16] = ddff[ii+16] | ((font_8x8[char_index1][ii] >> 5) & 1)<<5; //6bit  
ddff[ii+16] = ddff[ii+16] | ((font_8x8[char_index1][ii] >> 5) & 1)<<7; //6bit 
ddff[ii+24] = ddff[ii+24] | ((font_8x8[char_index1][ii] >> 6) & 1)<<1; //7bit  
ddff[ii+24] = ddff[ii+24] | ((font_8x8[char_index1][ii] >> 6) & 1)<<3; //7bit 
ddff[ii+24] = ddff[ii+24] | ((font_8x8[char_index1][ii] >> 7) & 1)<<5; //8bit  
ddff[ii+24] = ddff[ii+24] | ((font_8x8[char_index1][ii] >> 7) & 1)<<7; //8bit 
}//for

oled.writeBitmap((uint8_t*) ddff,
              row, (row + 4 - 1),
              com, (com + 8 - 1));

} //end chr11    


int main() {
    
    int a;
    int b;
    int c;
    int d;
    int e; //5bit
    int f; //6bit
    int g; //7bit
    char s[2] = {'@',0};
    
    int tl_f;
    int tls;
    int tl;
    
    int cursor1;
    int ii,jj;
    
    pc.baud(9600);
    
    myin9.mode( PullUp );   //  内蔵プルアップを使う

    //  oled.writeString(0, 0, 13, "Hello World !");
    //oled.writeString(0, 0, "Hello World !");
    //char11(0,0,'H');char11(0,8,'e');char11(0,16,'l');char11(0,24,'l');char11(0,32,'o');
    char ss1[]="Hello World !";
    ii=0;
    while(ss1[ii]!=0){
        char11(0,ii*8,ss1[ii]);ii++;
    }
    pc.printf("Printed something\r");    
    wait(3);
    //                      1234567890123456
    //oled.writeString(0, 0, "@               ");
    for(ii=0;ii<16;ii++){
        char11(0,ii*8,' ');
    }//end for
    char11(0,0,'@');

    e=0;f=0;g=0;

    tl = 33; //シリアル 1ビットの長さ
    cursor1 = 0;    
    while(1) {
        tl_f = 0;tls=33;
        while( myin9 == 1 ) {}
        for(int loop_i=1;loop_i <= 33;loop_i++){
            wait_ms(1);if(myin9 == 1 && tl_f == 0){tl_f=1;tls=loop_i*2;}
        }
        if(tl_f == 1) {tl = tls - 1;} // スタートビット目の次が1の場合と調整
        //wait_ms(tl); //debug
        a=!(myin9);   // 1bit
        wait_ms(tl);
        b=!(myin9);   // 2bit
        wait_ms(tl);
        c=!(myin9);   // 3bit
        wait_ms(tl);
        d=!(myin9);   // 4bit 16
        wait_ms(tl);
        
        e=!(myin9);    // 5bit 32
        wait_ms(tl);
        f=!(myin9);    // 6bit 64
        wait_ms(tl);
        g=!(myin9);    // 6bit 64
        wait_ms(tl);


        //a=0; // debug
        s[0]=g*64+f*32+e*16+d*8+c*4+b*2+a;
        
        if( s[0]=='_' ) {
            //画面クリア
            //                      1234567890123456
            //oled.writeString(0, 0, "                ");
            for(jj=0;jj<2;jj++){
            for(ii=0;ii<16;ii++){
                char11(jj*4,ii*8,' ');
            }//end for
            }//enf for
            //カーソルのクリア
            cursor1 = 0;
        } else {
            //文字の表示
            pc.printf(s);   
            //               y  x   
            //oled.writeString(0, cursor1, s);
            char11(
            (cursor1>>4)*4,
            ((cursor1-0) & 0x0f  )*8,
            s[0]);
            cursor1++; 
 
            //debug          
            //s[0]='0'+(tl/10);oled.writeString(1, 0, s);
            //s[0]='0'+(tl%10);oled.writeString(1, 1, s);
 
            //debug
            //s[0]='0'+g;oled.writeString(2, 0, s);
            //s[0]='0'+f;oled.writeString(2, 1, s);
            //s[0]='0'+e;oled.writeString(2, 2, s);           
            //s[0]='0'+d;oled.writeString(2, 3, s);
            //s[0]='0'+c;oled.writeString(2, 4, s);
            //s[0]='0'+b;oled.writeString(2, 5, s);
            //s[0]='0'+a;oled.writeString(2, 6, s);
            
        }
        
        if(cursor1 >= 32) {
            //画面クリア
            //                      1234567890123456
            //oled.writeString(0, 0, "                ");
            for(jj=0;jj<2;jj++){
            for(ii=0;ii<16;ii++){
                char11(jj*4,ii*8,' ');
            }//end for
            }//end for
            //カーソルのクリア
            cursor1 = 0;
        } //endif
        
        
        
        //myled = 1; // LED is ON
        //wait(0.2); // 200 ms
        //myled = 0; // LED is OFF
        //wait(0.2); // 1 sec
        
        //oled.writeString(0, 0, "Hello World !");  
        //pc.printf("Printed something\r");    
        //wait(0.5); //debug
  
    }
}

COMMENT