榆林國貿(mào)網(wǎng)站建設(shè)怎么做關(guān)鍵詞排名靠前
PCB 布局參考了老王0.8元128x32OLED顯示屏轉(zhuǎn)接板,開源項目地址:老王0.8元128x32OLED。
老王家買的屏幕放了快一年了,終于還是決定整個單獨的模塊,之前一直打算集成到開發(fā)板上的,不太靈活。相比那個轉(zhuǎn)接板,主要的修改是:
- 添加了3.3V LDO,ME6206A33,就是常用的662K,可以兼容3.3V 到5V 的輸入電壓;
- 四線SPI 接口加入了電平轉(zhuǎn)換電路,可以兼容3.3V 和5V 電平;
- 7pin 排針減少到6pin,去掉復位,沒什么用;
- 去掉多余的螺絲孔,板子面積很小,一個M3 螺絲就夠固定了。不需要螺絲固定的話還可以一剪子把螺絲孔突出的環(huán)形部分剪掉;
實物圖如下:
電路
就是復制粘貼成品OLED 模塊的上電路,電容的參數(shù)不敏感,小范圍變動取值對屏幕工作沒什么影響,比如C4,換成0.1uF 實測也OK。
供電
參考ME6206 的規(guī)格書:
OLED 工作電流不大,所以壓差應(yīng)該不超過300mV。理論上,如果輸入3.3V,輸出電壓仍大于3V,而OLED 芯片SSD1316 的規(guī)格書上說最低電壓3V,所以足夠驅(qū)動了。另外,OLED 模塊的電源正極V+ 可以不接,因為CS 線默認是高電平,只在通訊過程中拉低,其他幾個信號線也可能間歇地處于高電平,那么當單片機使用5V 供電時,可以只通過這幾個信號線給OLED 供電,實測基本能用,只是屏幕亮度會降低,還有點閃。
電平轉(zhuǎn)換
因為模塊是用SPI 驅(qū)動的,參考:SPI 接口OLED 使用5V 信號驅(qū)動可能需要電平轉(zhuǎn)換,就是說如果直接和5V 單片機連在一起,屏幕可能不工作,所以就加了四組分壓電路,用來把5V 電平降到3.3V。
還有個撥動開關(guān)SW-LVL-SHIFT,開關(guān)閉合時啟用分壓功能,斷開后分壓電路就退化成了限流電路,下拉部分R7 至R10 失去作用,R3 和R6 串入信號線里限流。經(jīng)過實測,用5V 的Arduino 驅(qū)動,只要限流電阻就夠了,OLED 可以工作,所以四個下拉電阻和撥動開關(guān)可以不裝。不過,SPI 信號線SCLK 和MOSI 上的限流電阻肯定會影響信號的上升時間,也就是說SPI 通信頻率不能太高,雖說我也沒試過最高能到多少。
焊接
- 原理圖里那兩個和0.1uF 電容并聯(lián)的4.7uF 電容可以不裝,之前試過,能用;
- 像上面說的,2k 下拉電阻R7 至R10 以及撥動開關(guān)也可以不裝;
- 如果確定不需要兼容5V 電平,LDO 可以去掉,1k 限流電阻可以用一坨錫替代;
- LDO 的輸入輸出電阻也可以用1uF,怎么方便怎么來;
所有元件都是貼片的,而且是單面安裝,推薦使用焊錫膏配加熱臺的焊接方式,我是用針管點錫膏的,反正元件種類不多,熟悉之后也挺快的,唯一的難點就是那個座子,我就沒遇到過能一次性焊好的。如果用加熱臺焊接,注意座子底下焊錫膏盡量少一點,免得之后連錫太多拖不開;要是焊錫膏太多,融化的錫球還可能把座子給頂起來。不推薦用熱風木倉焊座子,很容易烤壞,其實加熱臺基本也焊不了座子,只是能初步把座子固定在焊盤上,之后用烙鐵的時候稍微省點事。
座子的焊盤我修改過,把引腳的焊盤向外拉長了,就是為了方便檢查和用烙鐵拖。除了電烙鐵,必要的工具還有放大鏡和助焊膏。處理連錫的方法就是先助焊膏滿上,把烙鐵頭用海綿或者鋼絲球清理干凈,然后輕柔的貼在連錫的焊盤上向外拖。動作輕柔的目的是避免把焊盤刮壞,引腳的焊盤間距太小了,阻焊層很脆弱。此外,還要避免烙鐵頭把融化的錫擠到座子里面。除了容易連錫,還容易虛焊,可以用放大鏡快速觀察一下,涂滿助焊膏,在烙鐵頭上沾一點焊錫,然后從里往外拖,讓烙鐵上的錫沾到引腳和焊盤上,沾得焊錫太多就容易把焊錫擠進座子內(nèi)部。烙鐵和座子引腳接觸時間太長的話會讓座子內(nèi)部的銅引腳被加熱到比較高的溫度,焊錫也就更容易跑進去。
故障排除
如果單片機程序ok,但屏幕全黑,沒反應(yīng),首先考慮是不是座子上連錫或虛焊。連錫用放大鏡很容易觀察到,用干凈的烙鐵頭配上助焊膏也很容易拖干凈,所以更可能是虛焊。此時需要先把屏幕拔下來,這里也有點要注意的地方,如果是虛焊,說明座子的引腳只靠塑料件固定著,沒連到焊盤上,那么,剛經(jīng)過高溫焊接,塑料肯定有一些變形,引腳的固定不一定牢靠,有可能在拔掉屏幕時把座子的引腳一起拔下來,避免的方法當然是盡量控制焊接溫度和時間。然后要么拿放大鏡純靠眼力判斷虛焊的地方,要么就用萬用表測量焊盤和座子引腳的通斷,可能需要用細尖表筆,一個一個掃過去,熟練的話也不怎么費勁。
如果屏幕能亮,但是亮度比較低,會閃爍,那可能是那個560K 的電阻沒焊好。加熱臺上焊接有時候會出現(xiàn)立碑的現(xiàn)象,就是電阻之類的小東西一側(cè)的焊錫比較少,然后電阻被另一側(cè)的焊錫拉著拽起來了,導致電阻一邊浮空??傊蟛糠謫栴}應(yīng)該都是和座子的焊接有關(guān),其他元件沒焊好容易觀察到。
例程
使用例程參考Arduino 版u8g2 庫的例子,屏幕型號SSD1316 128x32,四線SPI 驅(qū)動方式,RST 不連接, 參數(shù)上寫U8X8_PIN_NONE
。雖然,似乎大部分人都說這屏幕是128x32,但我不管怎么試,看起來都更像是128x28,用8x7 的字符剛好夠顯示4 行,8x8 的字符第四行會顯示不全。順便放上一個Hello world 例程,Arduino 加U8G2 庫,使用硬件SPI:
/*HelloWorld.ino"Hello World" version for U8x8 APIUniversal 8bit Graphics Library (https://github.com/olikraus/u8g2/)Copyright (c) 2016, olikraus@gmail.comAll rights reserved.Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/#include
#include #ifdef U8X8_HAVE_HW_SPI
#include
#endif//DC 連接到D9, CS 到D10,SCK 和MOSI 連到對應(yīng)的SPI 引腳,V+ 連接到5V 或3.3V 電源,也可以不接。
U8X8_SSD1316_128X32_4W_HW_SPI u8x8(10, 9, U8X8_PIN_NONE); void setup(void)
{u8x8.begin();u8x8.setPowerSave(0);
}void loop(void)
{static bool line = false;u8x8.setFont(u8x8_font_chroma48medium8_r);if(line) {u8x8.drawString(0,1,"1: 8x7 character");u8x8.drawString(0,2,"2: 4 line => 28 ");}else {u8x8.drawString(0,1,"Hello World! ");u8x8.drawString(0,2,"Hello World! ");}line = !line;u8x8.drawString(0,0,"0 start line");u8x8.drawString(0,3,"3 end line");delay(2000);
}