发 帖  
原厂入驻New
[经验]

【MaaXBoard开发板试用体验】MaaXBoard灭灯及失败的OLED

2020-11-1 17:29:12  426 maaxboard
分享
0
    首先还是感谢英蓓特科技和电子发烧友提供的这次试用机会,开箱有很多人发过了不想再重复了。板子硬件配置很高,四核的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”文件赋值即可。程序代码:
  1. func Exec(CMD string)() {
  2.     exec.Command("sh", "-c", CMD).Run()
  3. }

  4. func main() {
  5.     Exec("echo 0 > /sys/class/leds/usr_led/brightness")
  6. }
复制代码


    运行go build可以生成可执行文件,运行后灯就灭了,没有难度。

    翻出来一个很早的给BPI用的OLED,都是兼容树莓派接口的,插上试一下
  1. package main

  2. import(
  3.         "fmt"
  4.         "os/exec"
  5.         "os"
  6.         "time"
  7. )

  8.         const PinRST byte = 79
  9.         const PinDIN byte = 135
  10.         const PinCLK byte = 134
  11.         const PinDC  byte = 153
  12.         const PinCS  byte = 137

  13.         var fdRST *os.File
  14.         var fdDIN *os.File
  15.         var fdCLK *os.File
  16.         var fdDC *os.File
  17.         var fdCS *os.File

  18. func Exec(CMD string)() {
  19.         exec.Command("sh", "-c", CMD).Run()
  20.         /*cmd := exec.Command("sh", "-c", CMD)
  21.         var out bytes.Buffer
  22.         var stderr bytes.Buffer
  23.         cmd.Stdout = &out
  24.         cmd.Stderr = &stderr
  25.         err := cmd.Run()
  26.     if err != nil {
  27.         fmt.Println(err.Error(), stderr.String())
  28.     } else {
  29.             fmt.Println(out.String())
  30.     }*/
  31. }

  32. func Unexpot(Pin byte) {
  33.         CMD := fmt.Sprintf("echo %d > /sys/class/gpio/unexport", Pin)
  34.         Exec(CMD)
  35. }

  36. func Expot(Pin byte) {
  37.         CMD := fmt.Sprintf("echo %d > /sys/class/gpio/export", Pin)
  38.         Exec(CMD)
  39. }

  40. func Direction(Pin byte, Dir string) {
  41.         CMD := fmt.Sprintf("echo %s > /sys/class/gpio/gpio%d/direction", Dir, Pin)
  42.         Exec(CMD)
  43. }

  44. func Value(Pin byte, HL byte) {
  45.         CMD := fmt.Sprintf("echo %d > /sys/class/gpio/gpio%d/value", HL, Pin)
  46.         Exec(CMD)
  47. }

  48. func OLED_Write(B byte) {
  49.         var L = []byte{0}
  50.         var H = []byte{1}
  51.         var C = []byte{0}

  52.         for I := 7; I >= 0; I-- {
  53.                 fdCLK.Write(L)
  54.                 C[0] = byte((B >> I) & 1)
  55.                 fdDIN.Write(C)
  56.                 fdCLK.Write(H)
  57.         }
  58. }

  59. func OLED_CMD(CMD byte) {
  60.         Value(PinDC, 0)

  61.         //Value(PinCS, 0)
  62.         OLED_Write(CMD)
  63.         //Value(PinCS, 1)
  64. }

  65. func OLED_DAT(DAT byte) {
  66.         Value(PinDC, 1)

  67.         //Value(PinCS, 0)
  68.         OLED_Write(DAT)
  69.         //Value(PinCS, 1)
  70. }

  71. func OLED_XY(X byte, Y byte) {
  72.         OLED_CMD(0xB0 + Y)
  73.         OLED_CMD(((X & 0xF0) >> 4) | 0x10)
  74.         OLED_CMD((X & 0x0F) | 0x00)
  75. }

  76. func OLED_Fill(DAT byte) {
  77.         var X, Y byte
  78.         for Y = 0; Y < 8; Y++ {
  79.                 OLED_CMD(0xB0 + Y)
  80.                 OLED_CMD(0x01)
  81.                 OLED_CMD(0x10)
  82.                 for X = 0; X < 128; X++ {
  83.                         OLED_DAT(DAT)
  84.                 }
  85.         }
  86. }

  87. func Delay(Count int) {
  88.         for I := 0; I < Count; I++ {

  89.         }
  90. }

  91. func main() {
  92.         Unexpot(PinRST)
  93.         Unexpot(PinDIN)
  94.         Unexpot(PinCLK)
  95.         Unexpot(PinDC)
  96.         Unexpot(PinCS)

  97.         Expot(PinRST)
  98.         Expot(PinDIN)
  99.         Expot(PinCLK)
  100.         Expot(PinDC)
  101.         Expot(PinCS)

  102.         Direction(PinRST, "out")
  103.         Direction(PinDIN, "out")
  104.         Direction(PinCLK, "out")
  105.         Direction(PinDC, "out")
  106.         Direction(PinCS, "out")

  107.         var err error
  108.         fdDIN, err = os.Create(fmt.Sprintf("/sys/class/gpio/gpio%d/value", PinDIN))
  109.         if err != nil {
  110.                 fmt.Println(err)
  111.         }
  112.         fdDC, _ = os.Create(fmt.Sprintf("/sys/class/gpio/gpio%d/value", PinDC))
  113.         fdCLK, _ = os.Create(fmt.Sprintf("/sys/class/gpio/gpio%d/value", PinCLK))

  114.         Value(PinRST, 0)
  115.         //time.Sleep(time.Duration(50) * time.Millisecond)
  116.         Value(PinRST, 1)
  117.         //time.Sleep(time.Duration(50) * time.Millisecond)

  118.         Value(PinDIN, 0)
  119.         Value(PinCLK, 1)
  120.         Value(PinDC, 0)
  121.         Value(PinCS, 0)
  122.         time.Sleep(time.Duration(50) * time.Millisecond)


  123.         OLED_CMD(0xAE);//--turn off oled panel
  124.         OLED_CMD(0x00);//---set low column address
  125.         OLED_CMD(0x10);//---set high column address
  126.         OLED_CMD(0x40);//--set start line address  Set Mapping RAM display Start Line (0x00~0x3F)
  127.         OLED_CMD(0x81);//--set contrast control register
  128.         OLED_CMD(0xCF); // Set SEG Output Current Brightness
  129.         OLED_CMD(0xA1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  130.         OLED_CMD(0xC8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  131.         OLED_CMD(0xA6);//--set normal display
  132.         OLED_CMD(0xA8);//--set multiplex ratio(1 to 64)
  133.         OLED_CMD(0x3F);//--1/64 duty
  134.         OLED_CMD(0xD3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  135.         OLED_CMD(0x00);//-not offset
  136.         OLED_CMD(0xD5);//--set display clock divide ratio/oscillator frequency
  137.         OLED_CMD(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  138.         OLED_CMD(0xD9);//--set pre-charge period
  139.         OLED_CMD(0xF1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  140.         OLED_CMD(0xDA);//--set com pins hardware configuration
  141.         OLED_CMD(0x12);
  142.         OLED_CMD(0xDB);//--set vcomh
  143.         OLED_CMD(0x40);//Set VCOM Deselect Level
  144.         OLED_CMD(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  145.         OLED_CMD(0x02);//
  146.         OLED_CMD(0x8D);//--set Charge Pump enable/disable
  147.         OLED_CMD(0x14);//--set(0x10) disable
  148.         OLED_CMD(0xA4);// Disable Entire Display On (0xa4/0xa5)
  149.         OLED_CMD(0xA6);// Disable Inverse Display On (0xa6/a7)
  150.         OLED_CMD(0xAF);//--turn on oled panel
  151. }
复制代码
   程序运行的流程:
    1.export 出需要用到的IO口;
    2.设置IO口的方向,因为没有读取的操作所以都是“out”;
    3.IO口写入高低电平值;
    4.初始化OLED成功,不清屏会显示花屏;

    上面是改过好几次的代码,无论是用shell来执行命令,还是用文件来操作IO口,OLED都没有反应。为了排除程序问题,直接“cat /sys/class/gpio/gpio%d/value”来查看是否输出成功也都是对的,所以怀疑这个OLED坏了,毕竟好几年的东西了,后面打算再用SPI来试一下。很可惜这次试验失败了,不过不影响我要做的广告机程序,温度控制使用echo来控制就可以了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

只有小组成员才能发言,加入小组>>

1741个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表