QR Code scanner for Arduino: Use 2d and QR barcode scanner with Arduino microcontroller (MCU)
If you are using Arduino MCU (microcontroller) to develop your system, and need a 1D/ 2D QR barcode scanner to work with it, then this article would be helpful for you. Here we introduce how we connect the Arduino Uno micro-controller with RTscan QR barcode scanners, and how to make them work with each other.
When we try to integrate a QR barcode scanner with the Arduino microcontroller board, we would meet these problems:
- The QR barcode scanner normally goes with a USB cable and RS232 cable, but Arduino board without this type of connector, then how can we connect them together?
- Whatever QR barcode scanners we choose, how can we control the barcode scanner by Arduino and also upload decoded data to the Ardunio system?
Read below and find how RTscan provides solutions for the above questions.
Contents
Part I: Introduction of Arduino UNO and RTscan QR barcode scanner
Part II: Connection solutions
- Solution 1: Connect via UART/ 12PIN TTL-232
- Solution 2: Connect via USB interface
Part III: Sample code/ Control the QR barcode scanner via Arduino system
- TTL-232 Communication
- USB CDC Communication
- USB-HID Communication
Part VI: Video Demo
Part I: Introduction of Arduino UNO and RTscan QR barcode scanner
Arduino UNO: The UNO is the most used and documented board of the whole Arduino microcontrollers family, many people choose this model for their projects. Arduino Uno has 14 digital input/output pins (of which 6 can be used as PWM outputs), 6 analog inputs, a 16 MHz quartz crystal, a USB connection, a power jack, an ICSP header, and a reset button. It contains everything needed to support the microcontroller.
And for our application to connect with the QR barcode scanner, we need the 3.3V (or the 5.0v) power supply pin, and GND pin, RXD, TXD pins.
Arduino UNO:
RTscan QR barcode scanners:
In this article, we choose RT870 and RT830C as examples to introduce our solutions.
Part II: Connection solutions:
Solution 1: Connect the QR barcode scanner via a 12pins flat cable (TTL-232 signal) interface ( for RT830C):
RTscan developed a multi-interface Shield, connect the shield with Arduino UNO, then connect the RT830C via a 12pins flat cable:
Solution 2: Connect the QR barcode scanner via a 4 pins UART (RS232 signal) interface ( for RT830C):
Use the multi-interface Shield, connect the shield with Arduino UNO, then connect the RT830C via a 4pins cable. The RT830C comes out RS232 signal to the shield, and the shield converts it to TTL-232 signal and transmits to Arduino board.
Note: to learn more about RT830C, please view: https://www.rtscan.net/Code-Readers/fixed-mount-embedded-kiosk-barcode-scanner-rt830c/
Solution 3: Connect the 2D QR barcode scanner via USB interface ( for RT870)
The RT830C without its own glass window, if you prefer an embedded barcode scanner with its own glass window, then you can choose our RT870 and use this solution: use an Arduino USB host shield as shown below.
Part III: Sample code/ Control the QR barcode scanner via Arduino system
We developed sample code to work with our scanners so that you can copy our source codes and program your system very quickly and no need to write the whole code one by one; save your time and speed up your integration work!
1. TTL-232 Communication (compatible with above solution 1 and solution 2)
Step 1: Hardware connection
Step 2: RT830C barcode scanner settings
RT830C needs to be set up with 232 output, scan the following barcode
Set to 232 Mode, the default baud rate is 115200, 8-n-1
Scan the below code to set the baud rate to 9600:
For more details, please refer to the full user manual.
Step 3: Run the sample code
Upload the below sample code rt830c_test_demo.ino to Arduino UNO.
/* RT870 Test demo by RTSCAN 20200903 */ #includeSoftwareSerial mySerial(2, 3); // RX, TX void printHex(char *p, int len) { char tmp[5]; for (int i = 0; i < len; i++) { sprintf(tmp, "%02x ", p[i]); Serial.print(tmp); } Serial.println(); } bool check_response(unsigned long timeout, String response) { char c; String buffer; bool found = false; unsigned long t = millis(); while (millis() - t < timeout) { if (mySerial.available() > 0) { c = mySerial.read(); buffer += c; if (buffer.indexOf(response) != -1 || buffer.equals(response)) { found = true; break; } } } while (mySerial.available() > 0) { c = mySerial.read(); buffer += c; } Serial.println(buffer); printHex(buffer.c_str(), buffer.length()); return found; } void send_cmd(char *p) { mySerial.print(p); check_response(100, p + 3); } void factory_defaults() { Serial.println("factory_defaults"); send_cmd("\x02\xf0\x03""0D0100""."); } void set_baud_rate(int baud) { Serial.println("set_baud_rate"); if(baud == 2400){ send_cmd("\x02\xf0\x03""0607023."); } else if(baud == 4800){ send_cmd("\x02\xf0\x03""0607024."); } else if(baud == 9600){ send_cmd("\x02\xf0\x03""0607025."); } else if(baud == 19200){ send_cmd("\x02\xf0\x03""0607026."); } else if(baud == 38400){ send_cmd("\x02\xf0\x03""0607027."); } else if(baud == 57600){ send_cmd("\x02\xf0\x03""0607028."); } else if(baud == 115200){ send_cmd("\x02\xf0\x03""0607029."); } } void get_baud_rate() { Serial.println("get_baud_rate"); send_cmd("\x02\xf0\x03""060702""?."); }
...
Please contact us to get full sample codes: sales@rtscan.net
And the RT830c automatically detects and reads bar codes.
Introduction of the serial port commands protocol for RT830c
Command example: if we want to set the unit default, the command data as below
2.USB CDC Communication (compatible with above solution 3 )
In this solution, the scanner is set to USB Com port emulation mode, and the Arduino recognizes the scanner via the USB host shield.
Step 1: Hardware connection
Connect the RT870 scanner to the USB port of the Arduino USB host shield through a USB data cable.
Step 2: RT870 settings
RT870 set to USB CDC mode, scan the following Setting bar code
Firstly, Set to USB cable
Then, Set to USB-CDC mode
*Recognized as USB com port device on the computer.
Step 3:Include the library
Arduino Library Manager
First, install Arduino IDE version 1.6.2 or newer, then simply use the Arduino Library Manager to install the library.
Please see the following page for instructions:
http://www.arduino.cc/en/Guide/Libraries#toc3
Manual installation
First download the library by clicking on the following link:
https://github.com/felis/USB_Host_Shield_2.0
Then uncompress the zip folder and rename the directory to “USB_Host_Shield_20”, as any special characters are not supported by the Arduino IDE.
Now open up the Arduino IDE and open “File>Preferences”. There you will see the location of your sketchbook. Open that directory and create a directory called “libraries” inside that directory. Now move the “USB_Host_Shield_20” directory to the “libraries” directory.
The final structure should look like this:
- Arduino/
- libraries/
- USB_Host_Shield_20/
- libraries/
Now quit the Arduino IDE and reopen it.
Now you should be able to open all the examples codes by navigating to “File>Examples>USB_Host_Shield_20”, and then select the example.
For more information please visit the following sites:
http://arduino.cc/en/Guide/Libraries
https://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use.
Step 4: Run the sample code
Run: acm_terminal. ino
#include... Please contact us to get full sample codes: sales@rtscan.net#include #include "pgmstrings.h" // Satisfy the IDE, which needs to see the include statment in the ino too. #ifdef dobogusinclude #include #endif #include class ACMAsyncOper : public CDCAsyncOper { public: uint8_t OnInit(ACM *pacm); }; uint8_t ACMAsyncOper::OnInit(ACM *pacm) { uint8_t rcode; // Set DTR = 1 RTS=1 rcode = pacm->SetControlLineState(3); if (rcode) { ErrorMessage (PSTR("SetControlLineState"), rcode); return rcode; } LINE_CODING lc; lc.dwDTERate = 115200; lc.bCharFormat = 0; lc.bParityType = 0; lc.bDataBits = 8; rcode = pacm->SetLineCoding(&lc); if (rcode) ErrorMessage (PSTR("SetLineCoding"), rcode); return rcode; } USB Usb; //USBHub Hub(&Usb); ACMAsyncOper AsyncOper; ACM Acm(&Usb, &AsyncOper); void setup() { Serial.begin( 115200 ); #if !defined(__MIPSEL__) while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection #endif Serial.println("Start"); Serial.println("Please set the scanner to USB CDC mode"); if (Usb.Init() == -1) Serial.println("OSCOKIRQ failed to assert"); delay( 200 ); }
Open the serial port for debugging
Scan any barcode and it will be shown as below:
3.USB-HIDCommunication
In this solution, the scanner is set to USB HID KBW mode. The Arduino recognizes the scanner via the USB host shield.
Step 1: Hardware connection
Connect the RT870 scanner to the USB port of the Arduino USB host shield through a USB data cable.
Step 2: RT870 settings
RT870 set to USB-HID mode, scan the following Setting bar code
Set to the USB output
Set to USB-HID mode
*Recognized as HID Keyboard Device on the computer.
Step 3: Include the library
Arduino Library Manager
First, install Arduino IDE version 1.6.2 or newer, then simply use the Arduino Library Manager to install the library.
Please see the following page for instructions:
http://www.arduino.cc/en/Guide/Libraries#toc3
Manual installation
First download the library by clicking on the following link:
https://github.com/felis/USB_Host_Shield_2.0
Then uncompress the zip folder and rename the directory to “USB_Host_Shield_20”, as any special characters are not supported by the Arduino IDE.
Now open up the Arduino IDE and open “File>Preferences”. There you will see the location of your sketchbook. Open that directory and create a directory called “libraries” inside that directory. Now move the “USB_Host_Shield_20” directory to the “libraries” directory.
The final structure should look like this:
- Arduino/
- libraries/
- USB_Host_Shield_20/
- libraries/
Now quit the Arduino IDE and reopen it.
Now you should be able to open all the examples codes by navigating to “File>Examples>USB_Host_Shield_20”, and then select the example.
For more information please visit the following sites:
http://arduino.cc/en/Guide/Libraries
https://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use.
Step 4: Run the sample code
Run:
Scanner_USBHIDUniversalKbd. ino
#include#include #include #include class KbdRptParser : public KeyboardReportParser { public: void PrintKey(uint8_t mod, uint8_t key); bool isScanEnd(); void PrintScanCode(); protected: void OnControlKeysChanged(uint8_t before, uint8_t after); void OnKeyDown (uint8_t mod, uint8_t key); void OnKeyUp (uint8_t mod, uint8_t key); void OnKeyPressed(uint8_t key); String ScanCode = ""; uint32_t FreeTime = 0; bool StartScan = false; }; void KbdRptParser::PrintKey(uint8_t m, uint8_t key) { MODIFIERKEYS mod; *((uint8_t*)&mod) = m; Serial.print((mod.bmLeftCtrl == 1) ? "C" : " "); Serial.print((mod.bmLeftShift == 1) ? "S" : " "); Serial.print((mod.bmLeftAlt == 1) ? "A" : " "); Serial.print((mod.bmLeftGUI == 1) ? "G" : " "); Serial.print(" >"); PrintHex (key, 0x80); Serial.print("< "); Serial.print((mod.bmRightCtrl == 1) ? "C" : " "); Serial.print((mod.bmRightShift == 1) ? "S" : " "); Serial.print((mod.bmRightAlt == 1) ? "A" : " "); Serial.println((mod.bmRightGUI == 1) ? "G" : " "); }; void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) { MODIFIERKEYS beforeMod; *((uint8_t*)&beforeMod) = before; MODIFIERKEYS afterMod; *((uint8_t*)&afterMod) = after; if (beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl) { Serial.println("LeftCtrl changed"); } if (beforeMod.bmLeftShift != afterMod.bmLeftShift) { Serial.println("LeftShift changed"); } if (beforeMod.bmLeftAlt != afterMod.bmLeftAlt) { Serial.println("LeftAlt changed"); } if (beforeMod.bmLeftGUI != afterMod.bmLeftGUI) { Serial.println("LeftGUI changed"); } if (beforeMod.bmRightCtrl != afterMod.bmRightCtrl) { Serial.println("RightCtrl changed"); } if (beforeMod.bmRightShift != afterMod.bmRightShift) { Serial.println("RightShift changed"); } if (beforeMod.bmRightAlt != afterMod.bmRightAlt) { Serial.println("RightAlt changed"); } if (beforeMod.bmRightGUI != afterMod.bmRightGUI) { Serial.println("RightGUI changed"); } } void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key) { Serial.print("DN "); PrintKey(mod, key); uint8_t c = OemToAscii(mod, key); if (c){ OnKeyPressed(c); } } void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) { // Serial.print("UP "); // PrintKey(mod, key); FreeTime = millis(); StartScan = true; } void KbdRptParser::OnKeyPressed(uint8_t key) { Serial.print("ASCII: "); Serial.println((char)key, HEX); // ScanCode = ScanCode + String((char)key); }; bool KbdRptParser::isScanEnd() { if(millis() - FreeTime > 200 && StartScan){ StartScan = false; return true; } return false; }; void KbdRptParser::PrintScanCode() { Serial.print("ScanCode: "); Serial.println(ScanCode); ScanCode = ""; }; USB Usb; HIDUniversal Hid(&Usb); KbdRptParser Prs; void setup() { Serial.begin( 115200 ); #if !defined(__MIPSEL__) while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection #endif Serial.println("Start"); Serial.println("Please set the scanner to USB HID mode"); if (Usb.Init() == -1) Serial.println("OSC did not start."); delay( 200 ); Hid.SetReportParser(0, &Prs); }
Open the serial port for debugging
Scan any barcode and it will be shown as below:
Part VI: Video Demo
Please refer to the following video for specific operations:
If you need an OEM barcode scanner module for Arduino, please read:
If you need an OEM barcode scanner for Raspberry Pi, please read:
If you need an Embedded barcode scanner for Raspberry Pi, please read: