风筝
发表于: 2022-4-2 15:21:16 | 显示全部楼层

在这篇文章中,我们将学习如何使用Arduino开发板和嵌入式QR/条形码扫描仪模块制作属于自己的条形码 + 二维码扫描仪。 该自制扫描仪可以扫描条形码或二维码,然后在OLED显示屏上显示读取到的内容。二维码经常用于跟踪供应链中的产品信息,通常用于营销和广告活动。最近,它们在帮助追踪冠状病毒暴露和减缓病毒传播方面发挥了关键作用。同样,条形码也可作为快速识别的手段应用于产品。它们在零售店中用作采购流程的一部分,在仓库中用于跟踪库存,在发票上用于协助会计处理。


为了制作Arduino的条形码+二维码扫描仪,我们将使用一款Maikrt的嵌入式二维码扫描模块。该模块支持USB和UART通信。它是一款小型条形码/二维码读取器,可嵌入任何设备中,用于扫描码以识别其他物品。它使用智能图像识别算法来识别条形码和二维码数据。


在本文中,我们将了解什么是二维码和条形码以及这些技术的工作原理。除此之外,我们将详细介绍Maikrt嵌入式二维码扫描模块。最后,我们将二维码扫描模块与Arduino开发板连接,并在OLED屏上显示读取的数据。


所需的组件

●    Arduino Nano开发板

●    Maikrt嵌入式二维码扫描模块

●    0.96寸I2C OLED显示屏

●    连接跳线

●    面包板


什么是条形码及其工作原理?

条形码(Barcode)代表打印在其下方的一行数字,带有黑白条图案。条形码专为计算机设计,可通过扫描红色LED灯或激光对其进行快速读取。

Barcode.jpg


条形码中的每个数字由七个大小相等的垂直块表示。它们以黑色或白色着色以表示十进制数字0-9。每个数字最终都由四个粗细的黑白条纹组成,其图案经过精心设计,即使您将其颠倒过来,也不会与任何其他数字混淆。

barcodestripes.gif


条形码扫描仪扫描数字转换打印的条码。然后它解码数据并将数据发送到计算机。它由一个镜头、一个光源和一个可以将光脉冲转换为电信号的光传感器组成。条形码扫描仪包含一个解码器,它分析传感器提供的图像数据并将其发送到输出端口。扫描图像后,它会链接到主机以传递捕获的信息。

how-barcode-scanner-works.png


解码器识别条码符号,翻译条码和空格内容,并将数据以我们可以阅读的格式传输到计算机。


什么是二维码及其工作原理?

二维码(QR Code)是用数据编码的可扫描条形码。编码意味着转换成特定的形式。在二维码中,数字和字母数字字符、字节和汉字转换为独特的二维正方形排列。当光学扫描仪经过这些方块时,它会将它们的排列转换回该数据的原始形式。

QR-Codes.jpg


二维码最重要的部分是数据模块(Data module)、定位标记(Position marker)和空白区(Quiet zone)。

QR-Code-Details.jpg


数据模块是二维码的标准单元。它通常是白色背景下的黑色方块。每个二维码上都有三个定位标记。它们由内眼和外眼组成,使扫描仪和相机能够快速准确地定位数据模块和扫描方向。空白区是数据模块矩阵四面的空白区域,包含所有数据模块和位置标记。它允许扫描仪和读取器以光学方式放置QR码的开始和结束位置。


二维码的模式代表二进制代码,可以解释为显示代码的数据。二维码扫描仪可以根据二维码外的三个方块来识别标准二维码。一旦它识别出这三个形状,它就知道正方形内包含的所有东西都是一个二维码。


然后,二维码扫描仪通过将整个内容分解为网格来分析二维码。它查看各个网格方块并根据它是黑色还是白色为每个网格分配一个值。然后它将网格方块分组以创建更大的图案。


Maikrt嵌入式二维码条码扫描模块

Maikrt嵌入式二维码条码扫描模块是一款1D/2D码阅读器。它可以嵌入任何设备中,用于扫描码以识别其他项目。它使用智能图像识别算法来读取二维码或条形码的数据。它可以轻松采集标签、纸张、手机或电脑显示器上的一维、二维条码。该模块具有最佳的灵敏度和高精度。

Maikrt-Embedded-QR-Code-Barcode-Scanning-Module.jpg


该模块具有USB和TTL接口,可直接与计算机或微控制器连接。配备9针端子线和USB线,方便您在TTL串口和USB接口之间进行转换。使用USB接口,模块直接扫描代码并将结果自动发送到您的主机。上位机接收到数据后,可以进行下一步操作。本模块默认波特率设置为9600。

Pinout.jpg


该模块带有9针4线终端线,用于与微控制器连接。红线是VCC(+5V) 引脚,黑线是GND,绿线和白线分别是Tx和Rx引脚。


条形码/二维码扫描模块与Arduino的硬件连接

现在让我们将条形码/二维码扫描模块连接到Arduino开发板。 由于模块只需要4个连接,所以连接相当简单。 连接图如下

Arduino-QR-Code-Scanner.jpg


将二维码扫描仪模块的红线 (VCC) 和黑线 (GND) 分别连接到Arduino的5V和GND引脚。 同样,将绿线 (Tx) 和白线 (Rx) 连接到Arduino的D3和D4引脚。

Arduino-QR-Code-Reader.jpg


代码

基于Arduino的条形码/二维码扫描仪的代码非常简单。 我们将使用软件串口库来读取接收到的数据。 您可以复制代码并将其上传到您的Arduino板。

  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(3, 4); // RX, TX

  3. void setup()
  4. {
  5.   Serial.begin(9600);  
  6.   mySerial.begin(9600); // set the data rate for the SoftwareSerial port
  7. }

  8. void loop()
  9. {
  10.   if (mySerial.available()) // Check if there is Incoming Data in the Serial Buffer.
  11.   {
  12.     while (mySerial.available()) // Keep reading Byte by Byte from the Buffer till the Buffer is empty
  13.     {
  14.       char input = mySerial.read(); // Read 1 Byte of data and store it in a character variable
  15.       Serial.print(input); // Print the Byte
  16.       delay(5); // A small delay
  17.     }
  18.     Serial.println();
  19.   }
  20. }
复制代码

代码上传后,您可以将任意二维码或条形码放在模块前面。模块将识别并准备好数据,然后将读取的数据显示在串口监视器上。

read-barcode-data.png


使用Arduino和OLED显示屏制作便携式条形码/二维码扫描仪

条形码/二维码描模块的测试使用上述代码完成。现在您可以将0.96寸I2C OLED显示屏和二维码扫描仪模块以及Arduino集成在一起。这样就可以制成便携式设备。


完整的电路图以及OLED显示屏连接非常简单。

Arduino-Barcode-QR-Code-Scanner-Reader.jpg


OLED显示屏是一个I2C模块。所以它有4根线:VCC、GND、SCL和SDA。将VCC和GND引脚连接到Arduino开发板的5V和GND引脚。同样,将SCL和SDA引脚分别连接到Arduino的A5和A4引脚。

Arduino-Barcode-Reader.jpg


代码

以下是便携式Arduino条形码/二维码描仪的程序代码。该代码需要两个用于OLED显示的库,即Adafruit GFX库SSD1306 OLED库。首先 Github 链接下载这些库,然后将其添加到Arduino Library文件夹中。


现在可以复制代码并将其上传到Arduino开发板。

  1. #include <Wire.h>
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_SSD1306.h>
  4. #include <SoftwareSerial.h>
  5. SoftwareSerial mySerial(3, 4); // RX, TX

  6. #define SCREEN_WIDTH 128    // OLED display width, in pixels
  7. #define SCREEN_HEIGHT 64    // OLED display height, in pixels
  8. #define OLED_RESET -1       // Reset pin # (or -1 if sharing Arduino reset pin)

  9. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

  10. void setup()
  11. {
  12.   Serial.begin(9600);
  13.   mySerial.begin(9600); // set the data rate for the SoftwareSerial port
  14.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
  15.   display.clearDisplay();
  16. }

  17. void loop()
  18. {
  19.   if (mySerial.available()) // Check if there is Incoming Data in the Serial Buffer.
  20.   {
  21.     display.setCursor(0, 0); //oled display

  22.     while (mySerial.available()) // Keep reading Byte by Byte from the Buffer till the Buffer is empty
  23.     {
  24.       char input = mySerial.read(); // Read 1 Byte of data and store it in a character variable
  25.       Serial.print(input); // Print the Byte

  26.       display.setTextSize(2);
  27.       display.setTextColor(WHITE);
  28.       display.print(input);
  29.       display.display();
  30.       delay(5);
  31.     }
  32.     Serial.println();
  33.     display.clearDisplay();
  34.   }
  35. }
复制代码

上传代码后,设备即可进行测试。 您可以开始扫描二维码或条形码。


测试便携式条形码/二维码扫描仪

您可以将任意条形码靠近扫描仪模块,它将扫描并将结果显示在OLED显示屏上。

Arduino-QR-Code-Barcode-Scanner.jpg


不仅是条形码,它还可以扫描二维码。 您可以使使用QR Code Generator网站生成您自己的二维码。

BSCAN.jpg


扫描二维码后,OLED显示屏会显示出正确的数据。

CSCAN.jpg


以上就是如何基于Arduino自制条形码和二维码扫描仪的方法,可以用于多种应用。如果有任何疑问,请在本帖下面进行回复。

跳转到指定楼层
wqx513
发表于: 2022-5-22 12:27:34 | 显示全部楼层

大哥,如果将扫描到的不同的条形码输出到相对应的端口上并输出高电平,程序要怎么写呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 15:57 , Processed in 0.048574 second(s), 10 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表