Problem Summary
The Adept Smart Car Kit (Arduino-compatible) ships with a control board based on the Arduino Uno R3 reference design. On macOS, the board commonly fails to upload sketches because of one or more of the following: a charge-only USB cable (5 V power lines only, no D+/D- data lines), a missing or unsigned CH340/CH341 USB-to-UART bridge driver, incorrect board/port selection in Arduino IDE, or a partially erased bootloader on the ATmega328P. The IDE typically shows the port as /dev/cu.usbserial-XXXX but reports not connected, which is the classic symptom of a missing driver or a power-only cable rather than a hardware fault.
Hardware Identification
Before changing any settings, confirm what is actually on the bench:
| Reference on Packing List | Identified As | Notes |
|---|---|---|
| Adept robot control board | Arduino Uno R3 compatible | Bottom silkscreen normally reads Arduino Uno
|
| USB Type-C cable (included) | USB-C to USB-A, often power-only | Verify D+/D- are wired, not just Vbus/GND |
| On-board UART bridge | CH340G, CH340C, or CH341 on most clones | Official Uno uses ATmega16U2; clones rarely do |
| Main MCU | ATmega328P-PU / ATmega328P-AU | 16 MHz, 5 V |
Clone boards use the CH340 family to convert USB to UART instead of the ATmega16U2 used on the genuine Arduino Uno. macOS does not ship with a CH340 driver, so the port will not enumerate until the driver is installed or the cable's data lines are pinned out correctly.
Root Cause Matrix
| Symptom in IDE | Most Likely Cause | Verification Step | Fix Path |
|---|---|---|---|
Port shows /dev/cu.usbserial-XXXX and disappears on disconnect |
USB cable carries data, driver missing | Open System Information > USB; check if CH340 enumerates | Install CH340 driver from manufacturer |
Port never appears, only /dev/cu.Bluetooth-Incoming-Port visible |
Power-only USB cable | Continuity test D+/D- pins of the cable | Replace with a known data USB-C to USB-A cable |
| Port visible but upload fails with not in sync error | Wrong bootloader selected, or ATmega328P fuse set to disable reset | Try Uno and Old Bootloader entries | Re-flash Optiboot via ICSP |
| Green power LED on, no Tx/Rx activity during upload | USB-UART bridge not receiving data, or board stuck in reset | Touch reset button moment upload starts | Replace cable, re-install driver |
| IDE shows Board at /dev/cu.usbserial-XXXX is not available | Driver signed for older macOS only, or in System Extension block list | Open System Settings > Privacy & Security > Extensions | Allow CH340 extension, reboot |
Diagnostic Procedure
- Connect the board with the included USB cable and open Apple menu > About This Mac > More Info > System Report > USB. Expand USB 3.0 Bus or USB 2.0 Bus and look for a
USB-SERIAL CH340device. If absent, the cable is likely power-only or the board's UART bridge is unpowered. - From Terminal, run
ls -l /dev/cu.usbserial*. Any output means the CDC-ACM or CH340 driver loaded; empty output means the device is not enumerated at all. - Open Arduino IDE 2.x > Tools > Port. Note whether
/dev/cu.usbserial-XXXXappears greyed or normal. Greyed = driver present but enumeration problem; absent = no driver or no cable data lines. - Tools > Get Board Info. If the IDE returns a valid 16-character serial and VID/PID pair, the USB path is healthy and any upload failure is firmware-side.
Cable Verification
Power-only cables are the single most common cause of "PC sees nothing" symptoms. A USB-C to USB-A cable has six relevant conductors for full function: Vbus (A4, A9), D+ (A6), D- (A7), GND (A5, A12), and the configuration channel (CC1/CC2). Charge-only cables omit D+/D- entirely to reduce cost.
Quick resistance checks between connector shells with a multimeter:
| Measurement | Expected Result (Data Cable) | Power-Only Cable |
|---|---|---|
| Pin A4 (Vbus) to pin B4 (Vbus) | < 0.5 ohm | < 0.5 ohm |
| Pin A7 (D-) to pin B7 (D-) | < 1 ohm | Open |
| Pin A6 (D+) to pin B6 (D+) | < 1 ohm | Open |
| Pin A5 (GND) to pin B5 (GND) | < 0.5 ohm | < 0.5 ohm |
If D+/D- are open, the cable is the fault. Test with any USB-C charging cable from a phone, external SSD enclosure, or a microcontroller kit that has been confirmed to upload. The cable requirement is exactly the same: a USB-C to USB-A data cable supporting USB 2.0 High Speed. Charging cables sold with low-cost accessories frequently fail this test.
CH340/CH341 Driver Installation on macOS
The CH340 family is manufactured by WCH (Nanjing Qinheng Microelectronics). Apple does not include a driver for this chipset in macOS. Two paths exist for installation:
Path A - Signed Driver from WCH
- Download the latest
CH34xVCPDriver.dmgorCH341SER_MACpackage from the official WCH product page at https://www.wch-ic.com/products/CH340.html or https://www.wch-ic.com/downloads/CH341SER_EXAM.html. Confirm the package is signed by Jiangsu Qinheng Microelectronics Co., Ltd. viacodesign -dv --verbose=4 /Library/Extensions/CH34xVCP.kextafter install. - Run the installer package. It places
CH34xVCP.kextinto/Library/Extensions. - On macOS High Sierra (10.13) and later, kexts must be approved in System Settings > Privacy & Security > Extensions. Reboot once after the first install.
- Plug the board back in and verify
ls -l /dev/cu.usbserial*now lists a node.
Path B - Homebrew / macports Open-Source Driver
- Install Homebrew with
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"per the official instructions at https://brew.sh. - Run
brew tap homebrew/cask-driversfollowed bybrew install --cask wch-usb-driveror install viabrew install ch340g-driverdepending on the tap version available. - Reboot and reconnect.
After installation, the board should appear at /dev/cu.usbserial-1410 (or higher). On the IDE, this node is the correct port. The /dev/tty.usbserial-XXXX equivalent is provided for incoming-call-style blocking reads; either works for upload, but Arduino IDE historically recommends cu. (call-out) devices on macOS.
Arduino IDE Configuration
| Parameter | Required Value (Smart Car Kit / Uno R3 Clone) |
|---|---|
| Board |
Arduino Uno (or Arduino Uno / Old Bootloader if upload fails with sync error) |
| Port |
/dev/cu.usbserial-XXXX corresponding to the CH340 |
| Processor | ATmega328P |
| Programmer | AVRISP mkII (default when using USB cable) |
| Upload Speed | 115200 baud |
If Arduino AVR Boards is not installed, open the Boards Manager (left rail icon), search Arduino AVR Boards, and install the package maintained by Arduino at https://github.com/arduino/ArduinoCore-avr. The package version shipped with IDE 2.2.1 and later is 1.8.6, which includes support for the Uno and standard Optiboot bootloader.
Upload Procedure
- Open the sketch from the Adept tutorial ZIP, for example
Car_IR_Control/Car_IR_Control.ino. - Verify the sketch compiles (Sketch > Verify, Cmd+R) and resolve any library errors before attempting upload. The Adept sketches depend on the
IRremotelibrary; install it via Library Manager if missing. - Select the port and board as above.
- Click Upload (Cmd+U). The Tx/Rx LEDs on the board should flicker for 5-10 seconds. If they do not blink at all, the USB-UART bridge is not receiving data and you are still on a power-only cable.
- If upload fails with avrdude: stk500_recv(): programmer is not responding, touch and release the reset button immediately after Upload begins; the firmware can be loaded if the bootloader is healthy but slow to enumerate.
Bootloader Diagnostics
If cable and driver are confirmed good and upload still fails, the Optiboot bootloader on the ATmega328P may be missing or corrupted. This happens if the previous sketch used the ArduinoISP programmer and erased the bootloader section inadvertently.
Recovery requires an external programmer. The cheapest path is a second Arduino running ArduinoISP, or a USBasp programmer. Use Tools > Programmer > Arduino as ISP, Tools > Burn Bootloader. The IDE will reinstall Optiboot at the standard 115200 baud and 16 MHz external crystal fuse setting (low fuse = 0xFF, high fuse = 0xDE, extended fuse = 0x05). See the official Arduino bootloader-burning guide at https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoISP for the wiring pinout (MOSI 11, MISO 12, SCK 13, SS 10, plus 5 V and GND).
Verification Tests
- After successful upload, open Tools > Serial Monitor at 9600 baud and confirm the Smart Car's firmware banner appears. The Adept
SmartCar.inoprints version and IR status to the serial console. - Disconnect USB, install a charged 18650 cell (or 4 x AA in the holder, observing polarity), and confirm the motor driver does not latch into brake or dead-state. A clean motor rest is the verification that the firmware loaded the GPIO maps correctly.
- Operate the IR remote supplied with the kit; the on-board red LEDs should fire when buttons are pressed, indicating the IR receiver and library are wired to the firmware's expected pins (typically A0 for IR and digital 3,5,6,9,10,11 for motor H-bridge PWM).
Common Pitfalls and Field Notes
- Cables vs ports: Front-panel USB ports on desktop Macs often fail to enumerate high-power USB-C devices on the first try. Use a rear motherboard port or the ports directly attached to the MacBook's USB-C/Thunderbolt bus.
- Driver blockers: macOS Sequoia (15.x) and Sonoma (14.x) ship with app-managed system extension approval. If the IDE sees the port briefly then disappears after a few seconds, the CH340 extension is not approved. Re-open System Settings > Privacy & Security and toggle the extension approval.
- Reset capacitor: The Adept board uses the Uno-compatible 100 nF DTR-reset capacitor. Some cheap clones use 470 nF or 1 uF, which holds the chip in reset too long and breaks upload. If the IDE prints Programmer not in sync, expected 0x14, got 0xFF and you have already ruled out the cable and the driver, replace C5 on the DTR net.
-
Bluetooth serial confusion: The
/dev/cu.Bluetooth-Incoming-Portnode is irrelevant for the Smart Car and will appear regardless of board connectivity. Always select/dev/cu.usbserial-XXXX. -
IDE version drift: Arduino IDE 1.8.x and 2.x use slightly different board-manager URLs. If using IDE 1.8.19, the default board URL
https://downloads.arduino.cc/packages/package_index.jsonis auto-populated, but custom indexes may overwrite it. Re-add the index per https://docs.arduino.cc/software/ide-v1/tutorials/Board-Manager-in-Arduino-IDE.
Driver Removal (If Replacing or Upgrading)
- Unplug the board.
- Run
sudo kextunload /Library/Extensions/CH34xVCP.kextfollowed bysudo rm -rf /Library/Extensions/CH34xVCP.kext /System/Library/Extensions/CH34xVCP.kext. - Reboot and confirm
kextstat | grep -i ch34returns nothing. - Re-install the latest signed driver from WCH if needed.
FAQ
Why does macOS show /dev/cu.usbserial-1410 but the IDE says the board is not connected?
The CH340 driver is loaded and the device node exists, but Arduino IDE only considers the port valid when Get Board Info returns a result and the Tx/Rx LEDs flicker on upload. A stale or unsigned driver (especially from third-party clones of the WCH package) reports the device but cannot send or receive, leaving the IDE in a not-connected state. Reinstall the driver from WCH's official product page and reboot.
Can I use any USB-C cable from a phone charger to upload to the Adept Smart Car board?
Only if the cable carries the USB 2.0 data pair (D+ and D-) in addition to Vbus and GND. Many low-cost charging cables omit the data lines to reduce cost; they will power the green LED on the board but the Arduino IDE will never see the port. Verify with a multimeter: pins A6 and A7 of the USB-C connector should show continuity to the corresponding lines on the USB-A plug.
Do I need to install a different driver if the board uses FT232 instead of CH340?
FT232 boards use FTDI's VCP driver, downloadable from https://ftdichip.com/drivers/vcp-drivers/. macOS may install a recent driver automatically, but on older macOS 10.13 to 10.15 versions the official FTDI driver is required. Confirm the chipset by inspecting the small square IC next to the USB connector; CH340 chips are square, FTDI chips are rectangular.
What baud rate and board selection should I use for the Adept sketches?
Select Arduino Uno from the AVR Boards package, ATmega328P processor, and 115200 baud upload speed. If the sketch uses an older Optiboot variant (pre-1.6 boards), choose Arduino Uno (Old Bootloader), which uploads at 57600 baud. The IDE will return a sync error within ~20 seconds if the wrong bootloader is selected.
My board uploads sketches fine but the motors do not run. Is the firmware or the hardware at fault?
If the upload finishes and Serial Monitor prints the firmware banner, the issue is hardware: check the TB6612FNG or L298N motor driver jumpers, verify the 7-12 V battery pack has cells installed with correct polarity, and confirm the enable pin jumpers are closed. The Adept firmware expects motor channels on digital pins 3, 5, 6, 9, 10, 11; the on-board red LEDs are mapped to the same pins for diagnostics and should fire during the self-test phase of SmartCar.ino.