|
BW16 5Ghz Wi-Fi MicrocontrollerAI-Thinker
|
x 1 | |
|
DIY PCB |
x 1 | |
|
RT9013-33GBRichtek USA Inc.
|
x 1 | |
|
0532614003Molex
|
x 1 | |
|
08055C105JAT2AMolex
|
x 2 |
|
arduino IDEArduino
|
BW16 Stamp - Tiny 5GHz WiFi Dev. Board
Demo 1:
Demo 2:
Want the best of 5G WiFi connectivity while still maintain super compact form factor? Then this is for you!
The super compact design allows for easy deployment on any kind of DIY platform as all pins are re-mapped to the breadboard-friendly 2.54 pitch castellated holes which are also good for surface mount soldering, also power regulating circuit already added with a 1.25mm battery connector, once plug in the battery, its ready for deployment!
To deploy a IoT microcontroller is often a pain as it requires portable power supply and efficient power regulation, and also to work well with most sensor and actuators, the pin pitch has to be breadboard friendly meaning 2.54mm apart from each other. To achieve this, I design this Ameba Stamp module, and it features,
1. Add power circuit and battery connector(P1.25) to easily provide the power the IC needs
The LDO used is RT9013, it works similar to AMS1117 LDO, but it requires much less passive components (only 2 de-coupling capacitors) and much much less quiescent current (≈25uA), which is about 80 times less than AMS1117 LDO. The footprint of this IC is also much smaller than both the DCDC convertor and AMS1117, the price and availability is also a big bonus,
2. Re-map the previously 2mm pitch pins to breadboard-friendly 2.54 pitch pins design so as to better work with other electronic components
3.Add solder pad for use with external switch
---
What can you do with BW16 stamp/dev board? let's watch a demo,
---
Besides this version, I have also designed and open source another version which uses AMS1117 as the power regulator which is able to deliver 1A current as compared to 0.5A from RT9013, but for BW16 module, the max instantaneous current drawn is around 200mA with average about 20mA with Wi-Fi connected, so 500mA is good enough for many low power profile projects.
If you are interested in AMS1117 version, please check out the link below at
https://hackaday.io/project/183644-bw16-stamp-tiny-5ghz-wifi-mcu
Version 2 is coming!
As a software engineer, though many things can be done in software, but the most direct and efficient way to control circuit is still through hardware design/modifications, that's why I am still updating the project, so that it can slowly but gradually grow bigger and better.
This time around, I wanna bring in a display to this tiny stamp-size board so user can have a little bit more interaction with.
To add on a new element, we have to apply the same principle:
minimal components, easy, cheap and power-saving
Therefore, this time, we chose a baremetal SPI TFT LCD display module with NO breakout board!
After many research, this one came to my attention (recommneded by another maker)
This is a SPI-interface 0.96" 1600x80 IPS Color TFT LCD Display that is driven by ST7735, it's super tiny and really cheap( ~$0.7)
Surprisingly and contrary to common understanding, just buying the baremetal display is more than enough for a display project, as the display itself usually comes packed with necessary components and driver IC inside so users often only need to add minimal peripheral circuit in order to work with it. In this schematic, we can see that a common LCD display breakout board is of very simple design,
With a well-design MCU and a stable power source, you may ignore all the peripheral circuit and still have a decent display performance.
Here is how to connect to the BW16 Stamp,
TP0 ---- NC
TP1 ---- NC
SDA ---- PA12
SCL ---- PA14
RS(DC) ---- PA26
RES ---- PB3
CS ---- PA15
GND ---- GND
NC ---- NC
VCC ---- VCC
LEDK(cathode) ---- GND
LEDA(anode) ---- VCC
GND ---- GND
Now, we just need to flash the example code to test its performance, to do that, we can use the "Adafruit ST7735" library downloadable from Arduino IDE. Here is the modified example code for BW16 stamp,
/************************************************************************** This is a library for several Adafruit displays based on ST77* drivers. Works with the Adafruit 1.8" TFT Breakout w/SD card ----> http://www.adafruit.com/products/358 The 1.8" TFT shield ----> https://www.adafruit.com/product/802 The 1.44" TFT breakout ----> https://www.adafruit.com/product/2088 The 1.14" TFT breakout ----> https://www.adafruit.com/product/4383 The 1.3" TFT breakout ----> https://www.adafruit.com/product/4313 The 1.54" TFT breakout ----> https://www.adafruit.com/product/3787 The 1.69" TFT breakout ----> https://www.adafruit.com/product/5206 The 2.0" TFT breakout ----> https://www.adafruit.com/product/4311 as well as Adafruit raw 1.8" TFT display ----> http://www.adafruit.com/products/618 Check out the links above for our tutorials and wiring diagrams. These displays use SPI to communicate, 4 or 5 pins are required to interface (RST is optional). Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried/Ladyada for Adafruit Industries. MIT license, all text above must be included in any redistribution **************************************************************************/ #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <SPI.h> #if defined(ARDUINO_FEATHER_ESP32) // Feather Huzzah32#define TFT_CS 14#define TFT_RST 15#define TFT_DC 32 #elif defined(ESP8266)#define TFT_CS 4#define TFT_RST 16 #define TFT_DC 5 #else// For the breakout board, you can use any 2 or 3 pins.// These pins will also work for the 1.8" TFT shield.#define TFT_CS 9#define TFT_RST 6 // Or set to -1 and connect to Arduino RESET pin#define TFT_DC 8 #endif // OPTION 1 (recommended) is to use the HARDWARE SPI pins, which are unique // to each board and not reassignable. For Arduino Uno: MOSI = pin 11 and // SCLK = pin 13. This is the fastest mode of operation and is required if // using the breakout board's microSD card. // For 1.44" and 1.8" TFT with ST7735 use: Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // For 1.14", 1.3", 1.54", 1.69", and 2.0" TFT with ST7789: //Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); // OPTION 2 lets you interface the display using ANY TWO or THREE PINS, // tradeoff being that performance is not as fast as hardware SPI above. //#define TFT_MOSI 11 // Data out //#define TFT_SCLK 13 // Clock out // For ST7735-based displays, we will use this call //Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); // OR for the ST7789-based displays, we will use this call //Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); float p = 3.1415926; void setup(void) { Serial.begin(115200); Serial.print(F("Hello! ST77xx TFT Test")); // Use this initializer if using a 1.8" TFT screen://tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab // OR use this initializer if using a 1.8" TFT screen with offset such as WaveShare:// tft.initR(INITR_GREENTAB); // Init ST7735S chip, green tab // OR use this initializer (uncomment) if using a 1.44" TFT:// tft.initR(INITR_144GREENTAB); // Init ST7735R chip, green tab // OR use this initializer (uncomment) if using a 0.96" 160x80 TFT: tft.initR(INITR_MINI160x80); // Init ST7735S mini display // OR use this initializer (uncomment) if using a 1.3" or 1.54" 240x240 TFT://tft.init(240, 240); // Init ST7789 240x240 // OR use this initializer (uncomment) if using a 1.69" 280x240 TFT://tft.init(240, 280); // Init ST7789 280x240 // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT://tft.init(240, 320); // Init ST7789 320x240 // OR use this initializer (uncomment) if using a 1.14" 240x135 TFT://tft.init(135, 240); // Init ST7789 240x135 // OR use this initializer (uncomment) if using a 1.47" 172x320 TFT://tft.init(172, 320); // Init ST7789 172x320 // SPI speed defaults to SPI_DEFAULT_FREQ defined in the library, you can override it here// Note that speed allowable depends on chip and quality of wiring, if you go too fast, you// may end up with a black screen some times, or all the time.//tft.setSPISpeed(40000000); Serial.println(F("Initialized")); uint16_t time = millis(); tft.fillScreen(ST77XX_BLACK); time = millis() - time; Serial.println(time, DEC); delay(500); // large block of text tft.fillScreen(ST77XX_BLACK); testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST77XX_WHITE); delay(1000); // tft print function! tftPrintTest(); delay(4000); // a single pixel tft.drawPixel(tft.width()/2, tft.height()/2, ST77XX_GREEN); delay(500); // line draw test testlines(ST77XX_YELLOW); delay(500); // optimized lines testfastlines(ST77XX_RED, ST77XX_BLUE); delay(500); testdrawrects(ST77XX_GREEN); delay(500); testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA); delay(500); tft.fillScreen(ST77XX_BLACK); testfillcircles(10, ST77XX_BLUE); testdrawcircles(10, ST77XX_WHITE); delay(500); testroundrects(); delay(500); testtriangles(); delay(500); mediabuttons(); delay(500); Serial.println("done"); delay(1000); } void loop() { tft.invertDisplay(true); delay(500); tft.invertDisplay(false); delay(500); } void testlines(uint16_t color) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, 0, x, tft.height()-1, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, 0, tft.width()-1, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, 0, 0, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(0, tft.height()-1, x, 0, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(0, tft.height()-1, tft.width()-1, y, color); delay(0); } tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color); delay(0); } for (int16_t y=0; y < tft.height(); y+=6) { tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color); delay(0); } } void testdrawtext(char *text, uint16_t color) { tft.setCursor(0, 0); tft.setTextColor(color); tft.setTextWrap(true); tft.print(text); } void testfastlines(uint16_t color1, uint16_t color2) { tft.fillScreen(ST77XX_BLACK); for (int16_t y=0; y < tft.height(); y+=5) { tft.drawFastHLine(0, y, tft.width(), color1); } for (int16_t x=0; x < tft.width(); x+=5) { tft.drawFastVLine(x, 0, tft.height(), color2); } } void testdrawrects(uint16_t color) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=0; x < tft.width(); x+=6) { tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color); } } void testfillrects(uint16_t color1, uint16_t color2) { tft.fillScreen(ST77XX_BLACK); for (int16_t x=tft.width()-1; x > 6; x-=6) { tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1); tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2); } } void testfillcircles(uint8_t radius, uint16_t color) { for (int16_t x=radius; x < tft.width(); x+=radius*2) { for (int16_t y=radius; y < tft.height(); y+=radius*2) { tft.fillCircle(x, y, radius, color); } } } void testdrawcircles(uint8_t radius, uint16_t color) { for (int16_t x=0; x < tft.width()+radius; x+=radius*2) { for (int16_t y=0; y < tft.height()+radius; y+=radius*2) { tft.drawCircle(x, y, radius, color); } } } void testtriangles() { tft.fillScreen(ST77XX_BLACK); uint16_t color = 0xF800; int t; int w = tft.width()/2; int x = tft.height()-1; int y = 0; int z = tft.width(); for(t = 0 ; t <= 15; t++) { tft.drawTriangle(w, y, y, x, z, x, color); x-=4; y+=4; z-=4; color+=100; } } void testroundrects() { tft.fillScreen(ST77XX_BLACK); uint16_t color = 100; int i; int t; for(t = 0 ; t <= 4; t+=1) { int x = 0; int y = 0; int w = tft.width()-2; int h = tft.height()-2; for(i = 0 ; i <= 16; i+=1) { tft.drawRoundRect(x, y, w, h, 5, color); x+=2; y+=3; w-=4; h-=6; color+=1100; } color+=100; } } void tftPrintTest() { tft.setTextWrap(false); tft.fillScreen(ST77XX_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST77XX_RED); tft.setTextSize(1); tft.println("Hello World!"); tft.setTextColor(ST77XX_YELLOW); tft.setTextSize(2); tft.println("Hello World!"); tft.setTextColor(ST77XX_GREEN); tft.setTextSize(3); tft.println("Hello World!"); tft.setTextColor(ST77XX_BLUE); tft.setTextSize(4); tft.print(1234.567); delay(1500); tft.setCursor(0, 0); tft.fillScreen(ST77XX_BLACK); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(0); tft.println("Hello World!"); tft.setTextSize(1); tft.setTextColor(ST77XX_GREEN); tft.print(p, 6); tft.println(" Want pi?"); tft.println(" "); tft.print(8675309, HEX); // print 8,675,309 out in HEX! tft.println(" Print HEX!"); tft.println(" "); tft.setTextColor(ST77XX_WHITE); tft.println("Sketch has been"); tft.println("running for: "); tft.setTextColor(ST77XX_MAGENTA); tft.print(millis() / 1000); tft.setTextColor(ST77XX_WHITE); tft.print(" seconds."); } void mediabuttons() { // play tft.fillScreen(ST77XX_BLACK); tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE); tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED); delay(500); // pause tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE); tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN); tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN); delay(500); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE); delay(50); // pause color tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED); tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED); // play color tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN); }
Done!
Let's watch a demo together!
Hooray!
Now that the connection and software has been verified, we can move on to create dedicated connections for this tiny yet powerful display on the BW16-Stamp directly!
BW16-Stamp LCD has arrived and worked!
Just having the display is far from our purpose, we need it to show colorful, dynamic and meaningful information. For that, we need a powerful and user-friendly graphic library, I have searched high and low and found out that the TFT_eSPI library might just be the right fit!
TFT_eSPI is a very interesting and powerful Arduino library, you can use it for sensor data display in a meter form, you can also use it to display some important information (such as resistor color code), and you can even connect to the internet via the 5G WiFi on the BW16 to get the time and date and display on the screen as an internet clock, and even put your favorite movie poster in it and add animation to watch it again and again ??
if haven't watched the Demo 2 from above, you may check it out, where I demonstrate BW160-Stamp LCD with many different graphic features.
The code demonstrated in the video are from maker VolosR, and here is his repo:
https://github.com/VolosR/InternetClock180x60
BTW, if you also want to make one for yourself and wonder how to get started, then the good news is:
I have already submitted a Pull Request(PR) to TFT_eSPI library's maintainer to add support for BW16 boards, and my PR was approved recently, and can be found here,
https://github.com/Bodmer/TFT_eSPI/commit/13e62a88d07ed6e29d15fe76b132a927ec29e307
This way, you will be able to directly and conveniently use this library just by selecting the corresponding header file in the User_Setup_Select.h file found inside the library.
---
This dev board support full-fledged Arduino framework and is being actively maintained, it comes with many interesting example code with its arduino package, for more information about how to get started programming it, check out the link below
BW16 Stamp - Tiny 5GHz WiFi Dev. Board
*PCBWay community is a sharing platform. We are not responsible for any design issues and parameter issues (board thickness, surface finish, etc.) you choose.
- Comments(0)
- Likes(2)
- 0 USER VOTES
- YOUR VOTE 0.00 0.00
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
More by SimonX
- Minimalist 5G WiFi & BLE microcontroller In my other projects, I have demonstrated the power of the Ameba RTL8720D based IoT microcontroller ...
- DIY Handheld Thermometer with WiFi BackgroundNow is 2022 and we are still combatting COVID and its varients, it's a long battle so we n...
- Machine Vision Trip WIre | Switch App when Motion Detected IntroductionWanna slack off abit but scared to be busted? Here is the all-in-one wireless tripwire t...
- Hand Controlled LED | OpenCV | MicroPython | IoT LED + OpenCV + MicroPython + AMB23 IoT Microcontrollers = Wireless Hand Control LEDLaziness is one o...
- 3D Printed Collapsing Light Saber with RGB LED Let's watch a demo first! ??https://www.youtube.com/shorts/7kb5SGYx1NIBackgroundRecently I got obsse...
- DIY Function Generator in 3 Lines Code IntroductionMake your own programmable Function Generator using only 3 lines of Python code!Function...
- Dual-Band Wi-Fi Toolkit | 2.4 + 5GHz | A powerful Swiss Army Knife for Wi-Fi IntroductionI have previously demonstrated a few other projects such as1) 5G WiFi Scanner2) WiFi Sig...
- BW16 Stamp - Tiny 5GHz WiFi Dev. Board Demo 1:Demo 2:Want the best of 5G WiFi connectivity while still maintain super compact form factor? ...
- The Fuxk Button | Best Desktop Tool for Linux Beginners What is this project about?When you just got started with Linux, there are a lot of commands to lear...
- DIY IoT Terminal Demo VideoIntroductionA dedicated IoT terminal can be really useful sometimes for displaying your Io...
-
-
-
-
-
-
3D printed Enclosure Backplate for Riden RD60xx power supplies
154 1 1 -
-