SkillAgentSearch skills...

PicoWiFiModem

A Pico W based RS232 <-> WiFi modem with Hayes AT style commands and LED indicators

Install / Use

/learn @mecparts/PicoWiFiModem
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Pico WiFi modem

A Pico W based RS232 <-> WiFi modem with Hayes AT style commands and LED indicators

| Front Panel | |:--:| | The Pico WiFi modem |

This project began as an exercise to learn about the Pico W and lwIP. Then, as I figured things out, it sort of took on a life of its own...

The code was ported from my Retro WiFi Modem. One look at it will betray its Arduino IDE origin! It's definitely not the most efficient way to do things in the Pico world, but it worked well enough for my purposes in learning "okay, I know what I want to do here, but how does the Pico C/C++ SDK do it?"

It likely would have been much faster to install one of the Pico-Arduino cores. I imagine there would have been far fewer code changes. But I don't think I would have learned anywhere near as much about the workings of the Pico W and lwIP as I did by using the Pico SDK.

The Hardware

| Prototype | |:--:| | The prototype |

As with the code, I re-up'd a lot of the original hardware decisions. But, since this time around it wasn't a pandemic project that I was trying to do as much as possible with parts on hand, I used a MAX3237 instead of a MAX3232.

| Interior | |:--:| | The interior |

The modem still uses the classic Hayes style blinking LEDs and a DE-9F for the RS-232 connector. Everything is displayed: RTS, CTS, DSR, DTR, DCD, RI, TxD and RxD. And this time, since I used a MAX3237, they're all brought out to the DE-9F connector. So things like using a change in the DTR line to go to command mode or end a call are supported (on a system that brings DTR out to the serial port, of course).

Since the Pico W doesn't have EEPROM on board, I added a small 4K I2C EEPROM to the mix. I could have used a block of the Pico's flash, but I wanted to get a feel for I2C on the Pico as well.

The Pico is socketed on this first board due to the lack of OTA programming. The PCB is set up to allow it to be soldered directly on the board once I have that figured out.

| Back Panel | |:--:| | The back panel |

The power connector expects a 2.1mm I.D. x 5.5mm O.D. barrel plug, delivering 5 volts, centre positive. I used a Tri-Mag L6R06H-050 (5V, 1.2A), DigiKey part# 364-1251-ND. If you plug in a 9V adapter like you'd use for an Arduino, you will let the magic smoke out and have an ex-modem on your hands.

| Schematic | |:--:| | The schematic |

On the off chance that there's someone else out there with a well stocked parts box and a burning desire to put together their own Pico WiFi modem, there's a BOM in the kicad sub directory. As was true with the original ESP8266 design, if you actually had to go out and buy all the parts, it really wouldn't be cost effective.

The case

I re-used the same case, a Hammond 1593N case (DigiKey part # HM963-ND or HM964-ND depending on whether you like black or grey). STL and OpenSCAD files are included for the front and back panels. You could use the proper Hammond red panel for the front (DigiKey part # HM965-ND), but they're only available in 10 packs and their price is highway robbery. I ended up using a slightly smaller red panel (DigiKey part # HM889-ND) that was ~much~ cheaper (it has recently increased in price by 500%) and available in single units.

The labels are unbelievably low tech. I print them on a piece of inkjet transparency film. I then cut that down to size so that it will fit under the LED opening. Then I attach the trimmed down transparency piece to a length of matte finish, invisible tape and carefully position it in place. A bit of careful work with an x-acto knife and you've got yourself a label that looks like it's part of the panel. If you look closely at the front panel image you can see the edges of the transparency film and the tape, but in practice they both essentially disappear.

The PCB

The PCB includes cutouts for the two columns that join the case together, and mounting holes for the 6 standoffs. Also, there's an oddly shaped cutout in back end to allow a particular IDC DE-9F I had on hand. It's available from DigiKey (or a very close clone is) but it's fairly pricey. But there's plenty of room for an ordinary solder cup DE-9F. You'd most likely want to omit the 10 pin header and just wire the DE-9F right to the board.

Unlike the original Retro Wifi Modem, I made no attempt to make this board by hand. Instead, I took advantage of an introductory offer by a well known PCB house and had PCBs made. 5 boards for under 20 bucks, and delivered in under a week? Who could say no?

The Software

| Builtin help | |:--:| | Modem command list |

The software is naturally quite similar to the original ESP8266 Wifi modem. There are a few changes (and one fairly major omission):

  • DTR signal handling (AT&D)
  • Escape sequence character definition (ATS2)
  • no OTA reprogramming (yet!)

First time setup

The default serial configuration is 9600bps, 8 data bits, no parity, 1 stop bit.

Here's the commands you need to set up the modem to automatically connect to your WiFi network:

  1. AT$SSID=your WiFi network name to set the WiFi network that the modem will connect to when it powers up.
  2. AT$PASS=your WiFi network password to set the password for the network.
  3. ATC1 to connect to the network.
  4. Optional stuff:
    • AT$SB=speed to set the default serial speed.
    • AT$SU=dps to set the data bits, parity and stop bits.
    • ATNETn to select whether or not to use Telnet protocol.
    • AT&Kn to use RTS/CTS flow control or not.
    • AT&Dn to set up DTR handling.
  5. AT&W to save the settings.

Once you've done that, the modem will automatically connect to your WiFi network on power up and will be ready to "dial up" a connection with ATDT.

Command Reference

Multiple AT commands can be typed in on a single line. Spaces between commands are allowed, but not within commands (i.e. AT S0=1 X1 Q0 is fine; ATS 0= 1 is not). Commands that take a string as an argument (e.g. AT$SSID=, AT$TTY=) assume that everything that follows is a part of the string, so no commands are allowed after them.

Command | Details ------- | ------- +++ | Online escape code. Once your modem is connected to another device, the only command it recognises is an escape code of a one second pause followed by three typed plus signs and another one second pause, which puts the modem back into local command mode. A/ | Repeats the last command entered. Do not type AT or press Enter. AT | The attention prefix that precedes all command except A/ and +++. AT? | Displays a help cheatsheet. ATA | Force the modem to answer an incoming connection when the conditions for auto answer have not been satisfied. ATC?<br>ATCn | Query or change the current WiFi connection status. A result of 0 means that the modem is not connected to WiFi, 1 means the modem is connected. The command ATC0 disconnects the modem from a WiFi connection. ATC1 connects the modem to the WiFi. ATDSn | Calls the host specified in speed dial slot n (0-9). ATDT<i>[+=-]host[:port]</i> | Tries to establish a WiFi TCP connection to the specified host name or IP address. If no port number is given, 23 (Telnet) is assumed. You can also use ATDT to dial one of the speed dial slots in one of two ways:<br><br><ul><li>The alias in each speed dial slot is checked to see if it matches the specified hostname.</li><li>A host specified as 7 identical digits dials the slot indicated by the digit. (i.e. 2222222 would speed dial the host in slot 2).</li></ul>Preceding the host name or IP address with a +, = or - character overrides the ATNET setting for the period of the connection.<br><br><ul><li>+ forces NET2 (fake Telnet)</li><li>= forces NET1 (real Telnet)</li><li>- forces NET0 (no Telnet)</li></ul>Once the dial attempt has begun, pressing any key before the connection is established will abort the attempt. ATE?<br>ATEn | Command mode echo. Enables or disables the display of your typed commands.<br><br><ul><li>E0 Command mode echo OFF. Your typing will not appear on the screen.</li><li>E1 Command mode echo ON. Your typing will appear on the screen.</li></ul> ATGEThttp://host[/page] | Displays the contents of a website page. https connections are not supported. Once the contents have been displayed, the connection will automatically terminate. ATH | Hangs up (ends) the current connection. ATI | Displays the current network status, including sketch build date, WiFi and call connection state, SSID name, IP address, and bytes transferred. ATNET?<br>ATNETn | Query or change whether telnet protocol is enabled. A result of 0 means that telnet protocol is disabled; 1 is Real telnet protocol and 2 is Fake telnet protocol. If you are connecting to a telnet server, it may expect the modem to respond to various telnet commands, such as terminal name (set with AT$TTY), terminal window size (set with AT$TTS) or terminal speed. Telnet protocol should be enabled for these sites, or you will at best see occasional garbage characters on your screen, or at worst the connection may fail.<br><br>The difference between real and fake telnet protocol is this: with real telnet protocol, a carriage return (CR) character being sent from the modem to th

Related Skills

View on GitHub
GitHub Stars58
CategoryDevelopment
Updated9d ago
Forks12

Languages

C

Security Score

100/100

Audited on Mar 21, 2026

No findings