【Arduino】mega2560 驱动grove 三色水墨屏

1,mega2560有四组UART硬件串口:

Serial(串口):
Serial 0:0 (RX) and 1 (TX); 
Serial 1: 19 (RX) and 18 (TX);
Serial 2: 17 (RX) and 16 (TX); 
Serial 3: 15 (RX) and 14 (TX).

串口波特率一般为:300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200。其中Serial0也是mega2560和计算机通信的UART口,因此如果有外接设备使用serial0,无法进行程序的上传。

(官网英文原文:On Uno, Nano, Mini, and Mega, pins 0 and 1 are used for communication with the computer. Connecting anything to these pins can interfere with that communication, including causing failed uploads to the board.)

(mega2560详细介绍:https://blog.csdn.net/yibu_refresh/article/details/40869187

2,使用softwareserial(),可以利用数字引脚生成软件串口,生成的串口使用方式和硬件串口类似,波特率可达115200bps,mega上可以使用的引脚为:

10,11,12,13,14,15,50,51,52,53,A8(62),A9(63),A10(64),A11(65),A12(66),A13(67),A14(68),A15(69);

生成的软件串口可以进行TTL logic level通信?

(softwareserial详细介绍:https://blog.csdn.net/yibu_refresh/article/details/40896745

3,Grove Mega shield扩展板

4,Grove电子水墨屏

与arduino的通信接口方式要求为UART,波特率要求230400bps,电压为3.3/5V。

Item Value
Supply voltage 3.3V / 5V
Operating temperature 0~40℃
Storage temperature -25~60℃
Humidity range 40~70%RH
Display resolution 152(H) x 152(V) pixel
DPI 140
Interface UART
Baud rate with Arduino 230400

(水墨屏详细介绍:http://wiki.seeedstudio.com/cn/Grove-Triple_Color_E-Ink_Display_1_54/#tech-support

每次将水墨屏重新上电以后,水墨屏会有一个类似于开机启动的的动画,最终稳定在一指定图案。

5,程序代码(图案的存储矩阵太大了就删去了部分)

/*
    154E_ink_arduino_code.ino
    Example for Triple Color E-Ink Display 1.54
    Copyright (c) 2018 Seeed Technology Co., Ltd.
    Website    : www.seeed.cc
    Author     : downey
    Create Time: October 2018
    Change Log :
    The MIT License (MIT)
    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:
    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    THE SOFTWARE.
*/

#include <Arduino.h>
#include <avr/pgmspace.h>
#include <Wire.h>

//Notice: When using the SAMD board, select the serial port(Serial/Serial1/SerialUSB...)
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
    #define SERIAL Serial
#else
    #define SERIAL Serial
#endif


const unsigned char IMAGE_BLACK[] PROGMEM = { /* 0X00,0X01,0X98,0X00,0X98,0X00, */
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X08,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X60,0X00,0X00,0X00,0X00,0X3C,0X60,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XFF,0XD8,0X02,0X00,0X00,0X00,
0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XFB,0XD0,0X00,
0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,
0XFB,0X90,0X00,0X00,0X00,0X00,0X00,0X00,
};

const unsigned char IMAGE_BLACK2[] PROGMEM = {  /* 0X00,0X01,0X98,0X00,0X98,0X00, */
0XF0,0X0F,0XFF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X7C,0X0A,
0X00,0X07,0XFD,0XE0,0X07,0XFF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X80,0XE8,0X08,0X80,0X0F,0XF8,0XE0,0X1F,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X3F,0X8F,0XFF,0XFF,0XF0,0XF3,0XDF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X27,0XFF,0XFC,0X1F,0XAB,0XFF,0XFF,0XE0,0XF3,0XDF,0XFF,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X10,0X07,0XFF,0XFC,0X1F,0XFF,0XFF,0XFE,0X01,0XF1,0XBF,0XFF,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X47,0XFF,0XFC,0X0F,0XFF,0XFF,0X80,0X01,0XFB,0XBF,
0XFF,0X81,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XF8,0X03,0XFF,0XF8,0X00,
0X01,0XF9,0XBF,0XFF,0X81,0X00,0X00,0X00,};

const unsigned char IMAGE_RED[] PROGMEM = { /* 0X00,0X01,0X98,0X00,0X98,0X00, */
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X24,0XFC,0XFF,0XFF,0XFF,
0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X24,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X0C,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,
};

const unsigned char IMAGE_RED2[] PROGMEM = { /* 0X00,0X01,0X98,0X00,0X98,0X00, */
0X8F,0XFC,0X02,0X18,0X00,0X00,0X00,0X00,0X20,0X00,0X00,0X00,0X01,0XFF,0XE3,0XFD,
0XFF,0XF9,0X03,0XDF,0XF8,0X00,0X18,0X00,0X00,0X00,0X00,0X30,0X00,0X00,0X10,0X00,
0X7F,0XFF,0XFF,0XFF,0XF0,0X07,0XFF,0XF0,0X00,0X08,0X00,0X00,0X00,0X00,0X00,0X00,
0XDC,0X00,0X03,0XEF,0XFF,0XF8,0X50,0X3F,0X2E,0X20,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFC,0X00,0X03,0XF8,0XFF,0XE0,0X3F,0XFE,0X3F,0X40,0X01,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X00,0X03,0XF0,0XFF,0XE0,0X7F,0XFE,0X36,0X40,
0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X07,0XFC,0X3F,0XEF,0XFF,
0XFE,0X17,0X40,0X00,0XFF,0XFF,0XFF,0XFF,
};

#define RECV_ERROR       -1
#define CONTINUE_TRANS    0
#define RECV_DONE         1

int begin_flag = 0;
//Send data to e-link board.
void serial_send_data(const uint8_t* data, uint32_t data_len) {
    for (int i = 0; i < data_len; i++) {
       SERIAL.write(pgm_read_byte(&data[i]));
    }
}

//Send image array
void write_image_picture0(void) { 
    for (int i = 0; i < 38; i++) {
        serial_send_data(&IMAGE_BLACK[i * 76], 76);
        delay(70);
    }
    delay(70);
    for (int i = 0; i < 38; i++) {
        serial_send_data(&IMAGE_RED[i * 76], 76);
        delay(70);
    }
    begin_flag = 0;
}

void write_image_picture1(void) {
    for (int i = 0; i < 38; i++) {
        serial_send_data(&IMAGE_BLACK2[i * 76], 76);
        delay(70);
    }
    delay(70);
    for (int i = 0; i < 38; i++) {
        serial_send_data(&IMAGE_RED2[i * 76], 76);
        delay(70);
    }
    begin_flag = 0;
}

//Send the start transfer command
void send_begin() {
    Serial.flush();
    char str = 'a';
    Serial.write(str);
    while (1) {
        if (Serial.available() > 0) {
            delay(10);
            str = Serial.read();
            Serial.print(str);
            if (str == 'b') {
                break;
            }
        }
    }
    str='a';
}


void setup() {
    SERIAL.begin(230400);
    delay(100);
    send_begin();
    delay(2000);
    write_image_picture0();
    delay(2000);
    Serial.flush();
}



void loop() {
        //180s is the safe time to display
        delay(10000);
        send_begin();
        delay(2000);
        write_image_picture1();
        Serial.flush();
    
}

(源代码地址:https://github.com/Seeed-Studio/Grove_Triple_Color_E-lnk_1.54/blob/eaf83da933289bb59d43ac1cdf51bf2f5c25f860/examples/E_ink154_factoryCode/E_ink154_factoryCode.ino

6,我遇到的问题

(1)使用除serial0外的硬件串口,以及全部软件串口,无法对水墨屏进行写入,可以确认的是确实有向与水墨屏通信的端口进行数据写入。

(2)先在mega2560上写入程序,再将水墨屏插入serial0,被证明可以对水墨屏进行写入。水墨屏完成开机动画后,可以在水墨屏上得到目标图案(过程中不要打卡PC与mega2560的串口通信窗口)。

(3)在(2)的程序中设置语句,需要串口Serial0接受到‘b’字符才能开始显示,但是程序写入mega2560之后,直接插上水墨屏,水墨屏会直接开始显示setup()函数中的图案,之后再直接显示loop()中的图案,之后再循环loop(),期间无论通过PC向mega2560是否输入‘b’,都不影响显示。过程中打开虚拟串口工具sscom,打卡mega2560所在的串口,按理说就是serial0串口,可以通过sscom向mega2560发送字符,但是sscom没有收到回复字符。

(好像就是mega2560和水墨屏两者在互相通信,通过sscom观察串口数据发现,会反复的依次出现:字符a,字符b,图像的数组;字符a,字符b,图像的数组;字符a,字符b,图像的数组;字符a,字符b,图像的数组......)

(4)拆除水墨屏与mega2560的连接,直接将程序下载到mega2560,用虚拟串口软件进行测试,可以得到正常运行的程序,通过字符‘b’可以控制串口数据的发送。

7,貌似已经解决大部分问题

(1)只有mega2560的serial0可以支持230400bps的波特率。

(2)代码中的send_begin()函数没有控制作用,只是用于mega2560与水墨屏之间的通信,代码中的字符‘b’会从水墨屏发送到mega2560(我是这么理解的)。

(3)水墨屏可以使用其他端口来控制,比如我可以用softwareserial(10,11)生成myserial软串口,用软串口接收到的信息进行代码的控制,进而控制水墨屏的显示。

发布了3 篇原创文章 · 获赞 5 · 访问量 383

猜你喜欢

转载自blog.csdn.net/Lorkmorn/article/details/104976744