Introduction
This highly integrated QR code scanner with excellent performance can recognize common 1D codes and 2D codes. With a small size, it employs easy-to-connect Gravity Interface and is equipped with a RGB indicator that feeds back the sensor recognition status by showing different colors.
Operating at 3.3V/5V, the scanner is compatible with UART and I2C communication, which makes it easier to develop on controllers like Arduino, ESP32, Raspberry Pi, etc. It can be used in self-service vending machines, subway gates, access control, payment machines, etc.
Features
- Use-to-connect Gravity interface
- 3.3V/5V power supply
- I2C & UART supported
Specification
- Power Supply: DC3.3V/5V
- Working Current: <70mA
- Communication: I2C, UART
- Image Pixel: 640*480
- Light Source: colorful indicator/green light flashing prompt successful reading
- Code System:
 - 1D: EAN13, EAN8, UPCA, UPCE0, UPCE1, Code128, Code39, Code93, CodeBar, Interleaved 2 of 5
 - 2D: QR code, Data Matrix, PDF417
- Depth of Field: QR Code (25mm-150mm product performance may be affected to varying degrees due to barcode quality and environmental conditions)
- Contrast: ≥25%
- Reading Angle: roll 360°, pitch 55°, yaw 55°
- Scanning Angle: 69° (horizontal), 56° (vertical)
- Reading Accuracy: ≥5mil
- Working Temperature: 20°C ~60°C
- Storage Temperature: -40°C ~80°C
- Environment Light: 0~100000Lux
- Relative Humidity: 5% to 95% (non-condensing)
Board Overview

| No. | Name | Function | 
|---|---|---|
| 1 | SDA/TX | I2C communication data line/UART transmitting data line | 
| 2 | SCL/RX | I2C communication clock line/UART receiving data line | 
| 3 | GND | Power - | 
| 4 | VCC | Power + (3.3/5V) | 
Tutorial
Requirements
- 
Hardware - DFRduino UNO R3 (or similar) x 1
- Gravity: Ring 2D QR Code Scanner x1
- M-M/F-M/F-F Jumper wires
 
- 
Software - Arduino IDE
- Download and install the [GM60 Library](). (About how to install the library?)
 
Connection Diagram

UART Sample Code
Turn the DIP switch of the adapter board to UART and then burn the code into your controller.
/*!
 *@file detect_uart.ino
 *@brief get the qr code information
 *@details  Scan QR codes continuously and serial output the information contained in codes.
 *@copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 *@license     The MIT license (MIT)
 *@author [fengli]([email protected])
 *@version  V1.0
 *@date  2021-6-29
 *@https://github.com/DFRobot/DFRobot_GM60
*/
#include <DFRobot_GM60.h>
DFRobot_GM60_UART  gm60;
/*Use software serial when using UNO or NANO*/
#if ((defined ARDUINO_AVR_UNO) || (defined ARDUINO_AVR_NANO))
    #include <SoftwareSerial.h>
    SoftwareSerial Serial1(2, 3);  //RX, TX
    #define FPSerial Serial1
    
#else
    #define FPSerial Serial1
#endif
void setup(){
  //Rx and tx should be mapping into D2 and D3 when using Firebeetle-ESP32
  #if (defined ESP32)
     Serial1.begin(9600, SERIAL_8N1, /*rx =*/D2, /*tx =*/D3);
  #else
  Serial1.begin(9600);
  #endif
  Serial.begin(115200);
  //Init chip
  gm60.begin(Serial1);
  //Restore to factory settings
 // gm60.reset();
  /**
  Read the data encoding mode
  encode Encoding mode
           eGBK,//gbk encoding
           eUTF8,//utf8 encoding
   */
  gm60.encode(/*encode = */gm60.eUTF8);
  
  /*! Set code config, the value of chip register can be changed by using the module to scan QR code
  on true (Enable setting code)/false (Disable setting code)
  content true (Output the set code content)/false (Not output the set code content)
  */
  gm60.setupCode(/*on =*/true,/*content=*/true);
  
  /**
    Set the available types of QR code for recognition
    berCode:
    eForbidAllBarcode, //Disable all the QR code recognition
    eEnableAllBarcode, // Enable all the QR code recognition
    eEnableDefaultcode, // Enable the default QR code recognition
  */
  gm60.setIdentify(/*berCode = */gm60.eEnableAllBarcode);
  Serial.println("Start to recognize");
}
void loop(){
  delay(50);
  // Detect the data contained in the scanned QR code, and return the scanned data as a character string.
  Serial.println(gm60.detection());
}
Expected Result
Detect the data contained in the scanned QR code, and return the scanned data as a character string and print it on the serial port.

I2C Sample Code
Turn the DIP switch of the adapter board to I2C and then burn the code into your controller.
/*!
 *@file detect_i2c.ino
 *@brief get the qr code information
 *@details  Scan QR codes continuously and serial output the information contained in codes.
 *@copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 *@license     The MIT license (MIT)
 *@author [fengli]([email protected])
 *@version  V1.0
 *@date  2021-6-29
 *@https://github.com/DFRobot/DFRobot_GM60
*/
#include <DFRobot_GM60.h>
/*!
 * @brief Constructor 
 * @param pWire I2c controller
 * @param addr  I2C address(0x1A)
 */
DFRobot_GM60_IIC  gm60;
void setup(){
  // Serial1.begin(9600);
  Serial.begin(115200);
  //Init chip
  gm60.begin();
  //Restore to factory settings
  gm60.reset();
  /**
  Read the data encoding mode
  encode Encoding mode
           eGBK,//gbk encoding
           eUTF8,//utf8 encoding
   */
  gm60.encode(gm60.eUTF8);
  
  /*! Set code config, the value of chip register can be changed by using the module to scan QR code
  on true (Enable setting code)/false (Disable setting code)
  content true (Output the set code content)/false (Not output the set code content)
  */
  gm60.setupCode(/*on =*/true,/*content=*/true);
  
  /**
    Set the available types of QR code for recognition
    berCode:
    eForbidAllBarcode, //Disable all the QR code recognition
    eEnableAllBarcode, // Enable all the QR code recognition
    eEnableDefaultcode, // Enable the default QR code recognition
  */
  gm60.setIdentify(gm60.eEnableAllBarcode);
  
  Serial.println("Start to recognize");
}
void loop(){
  delay(50);
  //Detect the data contained in the scanned QR code, and return the scanned data as a char string.
  Serial.println(gm60.detection());
}
Expected Result
Detect the data contained in the scanned QR code, and return the scanned data as a character string and print it on the serial port.
FAQ
For any questions, advice or cool ideas to share, please visit the DFRobot Forum.
