Lab
Which fault is this?
At the bench, faults don’t arrive labelled. These twenty cases come in a different order every time, and faults that look alike sit next to each other.
For each one, say two things before you tap: which box it is in (the phone, the module, the Arduino or the thing) and the one test that would split the causes. If you pick the tempting wrong test, the lab names the lure and says why it misleads.
All 20 cases, with their answers
- The phone pairs and connects. In the bridge, text typed in the Serial Monitor reaches the phone, but nothing typed on the phone ever reaches the Serial Monitor.
Box: the module. Test: Follow the one wire from the module’s TXD to pin 10. Lure: Change the baud rate. Phone to monitor dead, monitor to phone fine: the module box’s TXD wire to pin 10. The other arrow works, so leave pin 11, the divider and the baud rate alone. - A brand-new HC-05 on the bridge with BT_BAUD at 9600. Every letter from the phone arrives as rows of upside-down question marks.
Box: the module. Test: Set BT_BAUD to 38400 and upload. Lure: Decide the module is broken. Garbage from a new HC-05: the module’s baud rate, not a fault. Many HC-05 boards ship at 38400. Don’t touch the wires; garbage proves them. - Your HC-05 works with your Android phone. Your friend’s iPhone does not list it at all, though both phones are in the same room.
Box: the phone. Test: Does an Android phone list it? (It does, so the module is fine.) Lure: Change the pairing settings on the iPhone. An iPhone that never lists an HC-05: the phone box, and no setting fixes it. iOS can’t reach Classic modules. You need a BLE module. - You copied a car project from a tutorial. It compiles, but every upload now stops at “Uploading…” and fails. A new USB cable changes nothing.
Box: the Arduino. Test: Pull the module’s TXD and RXD wires and upload again. Lure: Try another USB cable or reinstall the driver. Uploads that hang after copying a tutorial: the Arduino box, a module on pins 0 and 1. Many tutorials put it there, and it talks over the upload. - A sketch from a forum drives the car. Each tap of the app’s forward button makes the car move, then the sketch prints “unknown command” twice.
Box: the Arduino. Test: Run bytes.ino: it shows 70, 13, 10. Lure: Look for the radio dropping bytes. Forward, then “unknown command” twice: the Arduino box, line endings. The app adds a carriage return and a new line, 13 and 10, and the sketch treats them as commands. - A new module shows in the phone’s list. The moment you tap it, it vanishes, and its LED goes dark for an instant before blinking again.
Box: the module. Test: Look where VCC goes, and move it to 5V. Lure: Blame the phone: forget it and re-pair. Listed, then gone on the tap: the module box, its power. Most often VCC is on the 3.3V pin, which can’t supply pairing current. - An HC-05’s LED blinks more slowly than it did a minute ago. You type AT in the bridge exactly as you did yesterday with your HC-06. Nothing comes back.
Box: the module. Test: Set BT_BAUD to 38400, keep the monitor at 9600, and check the line ending is Both NL & CR. Lure: Set the Serial Monitor to 38400. A slowly blinking HC-05 that won’t answer like an HC-06: the module’s AT-mode baud rate. Yesterday’s HC-06 used 9600; in AT mode an HC-05 talks at 38400. - The car drives, turns and stops on command, but the speed digits change nothing: it is always flat out.
Box: the thing. Test: Are ENA and ENB on PWM pins 5 and 6, and are the jumper caps off? Lure: Debug the dispatcher’s digit code. Speed digits that change nothing: the thing box, the enable pins. - You rebuilt the breadboard neatly. Now the phone connects, and nothing crosses in either direction.
Box: the module. Test: The bridge, one arrow at a time, then follow TXD to 10 and RXD to 11. Lure: Replace the module. Nothing either way after a rebuild: the data wires, swapped or one hole off. - Your sketch’s own Serial.println messages are clean in the Serial Monitor. Everything that comes from the module is garbage.
Box: the module. Test: Change BT_BAUD only: 9600, then 38400, then 115200. Lure: Change the Serial Monitor’s setting. Clean from the sketch, garbage from the module: the sketch and the module disagree. The monitor matches Serial.begin, so leave it alone. - Your HM-10 works with nRF Connect on an iPhone. The web-page remote you found shows no devices at all in Safari on the same iPhone.
Box: the phone. Test: Open the same page in Chrome on Android or a computer. Lure: Suspect the module. nRF Connect works, Safari shows nothing: the phone box, the browser. Safari has no Web Bluetooth on any version. - Your sketch prints debug messages with Serial.println. They now also appear on the phone’s terminal app.
Box: the Arduino. Test: Move the module to pins 10 and 11 and print again. Lure: Look for a bug in the app. Debug messages on the phone: the Arduino box, the module on pins 0 and 1. There the module and the USB share one serial port. - To spare the Arduino, you power the module from a separate 5-volt supply. Now only random characters arrive, whatever baud rate you try.
Box: the module. Test: Is there a wire from the module’s GND to the Arduino’s GND? Lure: Try other baud rates. Random characters with a separate supply: the module box, its ground wire. Without a shared ground, the two boards have no common idea of zero volts. - A forum post says HC-05 AT mode runs at 38400. You follow it. The HC-05 blinks slowly, and AT gives rows of upside-down question marks.
Box: the module or the Arduino. Test: Monitor back to 9600, BT_BAUD to 38400, upload. Lure: Assume the HC-05 isn’t in AT mode. The 38400 went into the Serial Monitor: that is the setting at fault. The forum meant the module’s rate. It belongs in the sketch, as BT_BAUD; the monitor stays at 9600. - Your own app has a Forward button. Pressing it makes the car go forward, then turn right.
Box: the Arduino. Test: Run bytes.ino: it shows seven numbers, not one. Lure: Check the motors or the wiring. Forward, then right: the Arduino box, bytes not words. The button sends the word FORWARD, and the dispatcher reads one byte at a time: F is forward, O is ignored, R is right. Make the app send F. - The Serial Monitor shows F arriving every time you press forward. Both motors do nothing at all.
Box: the thing. Test: Is the battery pack connected to the driver’s +12V and GND, and charged? Lure: Troubleshoot the Bluetooth. F arrives and the motors do nothing: the thing, its power. - A minute after you power it, the module is warm to the touch.
Box: the module. Test: Unplug, then read the labels at both ends of each power wire. The module box, its supply: VCC and GND swapped, or more than 6 V on VCC. Correct the polarity and the supply; replace the module if it is dead. - The module is in the phone’s list, but it won’t connect: the PIN you type is refused.
Box: the phone or the module. Test: Forget it everywhere, then retry 1234, then 0000. A wrong PIN, or the module is bonded to another device. Pair from one device only. - On forward, three wheels turn forward and one turns backward.
Box: the thing. Test: Send forward with the wheels up and watch each wheel. The thing box: that motor is mounted the other way round. Swap its two wires, or its two IN pins. - The link drops, or the Arduino resets, the moment the motors start.
Box: the thing. Test: Charge the cells; then run the Arduino on USB and the motors on the pack: do the resets stop? The supply sagging under motor current. Charge the cells, and check the pack reads about 7.4 V.
What this shows
Every Arduino Bluetooth fault lives in one of four boxes: the phone, the module, the Arduino, or the thing it drives. Finding the box first, then running the one test that splits the causes, beats changing things until it works.
Most faults have a lure: the tempting wrong move. A baud mismatch garbles text but never silences one direction, so a dead direction is a wire, not a baud rate. Garbage proves the wires are fine. An iPhone that cannot see an HC-05 is the phone box, and no setting fixes it. Letters arriving prove the phone, the module and the Arduino, so motors that do nothing are the thing's power.
The cases are interleaved on purpose, because at the bench faults do not arrive labelled. Saying the box and the test before checking is the habit the exercise builds.
Common questions
- How do I troubleshoot an Arduino Bluetooth project?
- Decide which box the fault is in: the phone, the module, the Arduino or the thing. Then run the one test that splits that box's causes, change one thing, and test again. The bridge sketch, sending one arrow at a time, separates most link faults.
- Why does only one direction of my Bluetooth link work?
- A data wire: one of TXD to the Arduino's receive pin or RXD to its transmit pin is swapped, off by a hole or off the divider junction. A baud mismatch would garble both directions, not silence one.
- The Serial Monitor shows the letter arriving but the motors do nothing. What is wrong?
- The thing's power. The letter arriving proves the phone, the module and the Arduino. Check the battery pack is connected to the motor driver's +12V and GND and is charged.