` 首先还是感谢英蓓特科技和电子发烧友提供的这次试用机会,开箱有很多人发过了不想再重复了。板子硬件配置很高,四核的i.MX 8M及USB 3.0、HDMI、2.4G及5G的WIFI都有,唯一遗憾的是TYPE-C只能用于供电。按照教程使用SD卡烧写了DebianLite系统上电就能跑起来。系统里没有什么乱七八糟的程序,最主要的就是一个视频播放器,非常适合我的应用,因为我想做个广告机,有其他东西还要往下删。系统里自带了两段视频,一个是4K的,一个是1080P的。1080P的播放起来非常流畅,CPU占用率也很低,通过HDMI出来的音质也很好。但是播放4K的视频有一点点卡,好在我用不到,1080P足够满足我了。CPU在播放的时候有点热,必须要加风扇使用。
想做成广告机就得自己写程序,网上下载的广告机程序不适合我,通讯协议和播放方式和我们的不一样。有了操作系统,开发程序可以随便挑,这次我用go语言来开发,运行效率也就比C语言低一点,但是开发效率能提高很多。https://golang.org/dl/上有编译好的go语言环境,直接下载ARM64的安装好就可以使用了。
第一步还是从LED控制开始,板载的user led默认是亮的,我就把它关掉。想要控制这个灯,只要对“/sys/class/leds/usr_led/brightness”文件赋值即可。程序代码:
- func Exec(CMD string)() {
- exec.Command("sh", "-c", CMD).Run()
- }
- func main() {
- Exec("echo 0 > /sys/class/leds/usr_led/brightness")
- }
复制代码
运行go build可以生成可执行文件,运行后灯就灭了,没有难度。
翻出来一个很早的给BPI用的OLED,都是兼容树莓派接口的,插上试一下
- package main
- import(
- "fmt"
- "os/exec"
- "os"
- "time"
- )
- const PinRST byte = 79
- const PinDIN byte = 135
- const PinCLK byte = 134
- const PinDC byte = 153
- const PinCS byte = 137
- var fdRST *os.File
- var fdDIN *os.File
- var fdCLK *os.File
- var fdDC *os.File
- var fdCS *os.File
- func Exec(CMD string)() {
- exec.Command("sh", "-c", CMD).Run()
- /*cmd := exec.Command("sh", "-c", CMD)
- var out bytes.Buffer
- var stderr bytes.Buffer
- cmd.Stdout = &out
- cmd.Stderr = &stderr
- err := cmd.Run()
- if err != nil {
- fmt.Println(err.Error(), stderr.String())
- } else {
- fmt.Println(out.String())
- }*/
- }
- func Unexpot(Pin byte) {
- CMD := fmt.Sprintf("echo %d > /sys/class/gpio/unexport", Pin)
- Exec(CMD)
- }
- func Expot(Pin byte) {
- CMD := fmt.Sprintf("echo %d > /sys/class/gpio/export", Pin)
- Exec(CMD)
- }
- func Direction(Pin byte, Dir string) {
- CMD := fmt.Sprintf("echo %s > /sys/class/gpio/gpio%d/direction", Dir, Pin)
- Exec(CMD)
- }
- func Value(Pin byte, HL byte) {
- CMD := fmt.Sprintf("echo %d > /sys/class/gpio/gpio%d/value", HL, Pin)
- Exec(CMD)
- }
- func OLED_Write(B byte) {
- var L = []byte{0}
- var H = []byte{1}
- var C = []byte{0}
- for I := 7; I >= 0; I-- {
- fdCLK.Write(L)
- C[0] = byte((B >> I) & 1)
- fdDIN.Write(C)
- fdCLK.Write(H)
- }
- }
- func OLED_CMD(CMD byte) {
- Value(PinDC, 0)
- //Value(PinCS, 0)
- OLED_Write(CMD)
- //Value(PinCS, 1)
- }
- func OLED_DAT(DAT byte) {
- Value(PinDC, 1)
- //Value(PinCS, 0)
- OLED_Write(DAT)
- //Value(PinCS, 1)
- }
- func OLED_XY(X byte, Y byte) {
- OLED_CMD(0xB0 + Y)
- OLED_CMD(((X & 0xF0) >> 4) | 0x10)
- OLED_CMD((X & 0x0F) | 0x00)
- }
- func OLED_Fill(DAT byte) {
- var X, Y byte
- for Y = 0; Y < 8; Y++ {
- OLED_CMD(0xB0 + Y)
- OLED_CMD(0x01)
- OLED_CMD(0x10)
- for X = 0; X < 128; X++ {
- OLED_DAT(DAT)
- }
- }
- }
- func Delay(Count int) {
- for I := 0; I < Count; I++ {
- }
- }
- func main() {
- Unexpot(PinRST)
- Unexpot(PinDIN)
- Unexpot(PinCLK)
- Unexpot(PinDC)
- Unexpot(PinCS)
- Expot(PinRST)
- Expot(PinDIN)
- Expot(PinCLK)
- Expot(PinDC)
- Expot(PinCS)
- Direction(PinRST, "out")
- Direction(PinDIN, "out")
- Direction(PinCLK, "out")
- Direction(PinDC, "out")
- Direction(PinCS, "out")
- var err error
- fdDIN, err = os.Create(fmt.Sprintf("/sys/class/gpio/gpio%d/value", PinDIN))
- if err != nil {
- fmt.Println(err)
- }
- fdDC, _ = os.Create(fmt.Sprintf("/sys/class/gpio/gpio%d/value", PinDC))
- fdCLK, _ = os.Create(fmt.Sprintf("/sys/class/gpio/gpio%d/value", PinCLK))
- Value(PinRST, 0)
- //time.Sleep(time.Duration(50) * time.Millisecond)
- Value(PinRST, 1)
- //time.Sleep(time.Duration(50) * time.Millisecond)
- Value(PinDIN, 0)
- Value(PinCLK, 1)
- Value(PinDC, 0)
- Value(PinCS, 0)
- time.Sleep(time.Duration(50) * time.Millisecond)
- OLED_CMD(0xAE);//--turn off oled panel
- OLED_CMD(0x00);//---set low column address
- OLED_CMD(0x10);//---set high column address
- OLED_CMD(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
- OLED_CMD(0x81);//--set contrast control register
- OLED_CMD(0xCF); // Set SEG Output Current Brightness
- OLED_CMD(0xA1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
- OLED_CMD(0xC8);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
- OLED_CMD(0xA6);//--set normal display
- OLED_CMD(0xA8);//--set multiplex ratio(1 to 64)
- OLED_CMD(0x3F);//--1/64 duty
- OLED_CMD(0xD3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
- OLED_CMD(0x00);//-not offset
- OLED_CMD(0xD5);//--set display clock divide ratio/oscillator frequency
- OLED_CMD(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
- OLED_CMD(0xD9);//--set pre-charge period
- OLED_CMD(0xF1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
- OLED_CMD(0xDA);//--set com pins hardware configuration
- OLED_CMD(0x12);
- OLED_CMD(0xDB);//--set vcomh
- OLED_CMD(0x40);//Set VCOM Deselect Level
- OLED_CMD(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
- OLED_CMD(0x02);//
- OLED_CMD(0x8D);//--set Charge Pump enable/disable
- OLED_CMD(0x14);//--set(0x10) disable
- OLED_CMD(0xA4);// Disable Entire Display On (0xa4/0xa5)
- OLED_CMD(0xA6);// Disable Inverse Display On (0xa6/a7)
- OLED_CMD(0xAF);//--turn on oled panel
- }
复制代码
程序运行的流程:
1.export 出需要用到的IO口;
2.设置IO口的方向,因为没有读取的操作所以都是“out”;
3.IO口写入高低电平值;
4.初始化OLED成功,不清屏会显示花屏;
上面是改过好几次的代码,无论是用shell来执行命令,还是用文件来操作IO口,OLED都没有反应。为了排除程序问题,直接“cat /sys/class/gpio/gpio%d/value”来查看是否输出成功也都是对的,所以怀疑这个OLED坏了,毕竟好几年的东西了,后面打算再用SPI来试一下。很可惜这次试验失败了,不过不影响我要做的广告机程序,温度控制使用echo来控制就可以了。
`
|