Chapter 1 described how to connect the Arduino serial port to your computer to upload sketches. The upload process sends data from your computer to Arduino and Arduino sends status messages back to the computer to confirm the transfer is working. The recipes here show how you can use this communication link to send and receive any information between Arduino and your computer or another serial device.
DRIVER ROBOT WITH SERIAL Serial Key keygen
Your Arduino sketch can use the serial port to indirectly access (usually via a proxy program written in a language like Processing) all the resources (memory, screen, keyboard, mouse, network connectivity, etc.) that your computer has. Your computer can also use the serial link to interact with sensors or other devices connected to Arduino.
Implementing serial communications involves hardware and software. The hardware provides the electrical signaling between Arduino and the device it is talking to. The software uses the hardware to send bytes or bits that the connected hardware understands. The Arduino serial libraries insulate you from most of the hardware complexity, but it is helpful for you to understand the basics, especially if you need to troubleshoot any difficulties with serial communications in your projects.
Boards including the Uno, Duemilanove, Diecimila, Nano, and Mega have a chip to convert the hardware serial port on the Arduino chip to Universal Serial Bus (USB) for connection to the hardware serial port. Other boards, such as the Mini, Pro, Pro Mini, Boarduino, Sanguino, and Modern Device Bare Bones Board, do not have USB support and require an adapter for connecting to your computer that converts TTL to USB. See for more details on these boards.
Some serial devices use the RS-232 standard for serial connection. These usually have a nine-pin connector, and an adapter is required to use them with the Arduino. RS-232 is an old and venerated communications protocol that uses voltage levels not compatible with Arduino digital pins.
The Arduino Mega has four hardware serial ports that can communicate with up to four different serial devices. Only one of these has a USB adapter built in (you could wire a USB-TTL adapter to any of the other serial ports). Table 4-1 shows the port names and pins used for all of the Mega serial ports.
You will usually use the built-in Arduino serial library to communicate with the hardware serial ports. Serial libraries simplify the use of the serial ports by insulating you from hardware complexities.
Sometimes you need more serial ports than the number of hardware serial ports available. If this is the case, you can use an additional library that uses software to emulate serial hardware. Recipes 4.13 and 4.14 show how to use a software serial library to communicate with multiple devices.
The hardware or software serial libraries handle sending and receiving information. This information often consists of groups of variables that need to be sent together. For the information to be interpreted correctly, the receiving side needs to recognize where each message begins and ends. Meaningful serial communication, or any kind of machine-to-machine communication, can only be achieved if the sending and receiving sides fully agree how information is organized in the message. The formal organization of information in a message and the range of appropriate responses to requests is called a communications protocol.
To display text and numbers from your sketch on a PC or Mac via a serial link, put the Serial.begin(9600) statement in setup(), and then use Serial.print() statements to print the text and values you want to see.
The Arduino Serial Monitor function can display serial data sent from Arduino. To start the Serial Monitor, click the Serial Monitor toolbar icon as shown in Figure 4-2. A new window will open for displaying output from Arduino.
Your sketch must call the Serial.begin() function before it can use serial input or output. The function takes a single parameter: the desired communication speed. You must use the same speed for the sending side and the receiving side, or you will see gobbledygook (or nothing at all) on the screen. This example and most of the others in this book use a speed of 9,600 baud (baud is a measure of the number of bits transmitted per second). The 9,600 baud rate is approximately 1,000 characters per second. You can send at lower or higher rates (the range is 300 to 115,200), but make sure both sides use the same speed. The Serial Monitor sets the speed using the baud rate drop down (at the bottom right of the Serial Monitor window in Figure 4-2). If your output looks something like this:
You can use a liquid crystal display as a serial output device, although it will be very limited in functionality. Check the documentation to see how your display handles carriage returns, as some displays may not automatically advance to a new line after println statements.
Another approach is to use a library called TextFinder, which is available from the Arduino Playground. TextFinder was created to extract information from web streams (see Chapter 15), but it works just as well with serial data. The following sketch uses TextFinder to provide similar functionality to the previous sketch:
You can also send binary data using structures. Structures are a mechanism for organizing data, and if you are not already familiar with their use you may be better off sticking with the solutions described earlier. For those who are comfortable with the concept of structure pointers, the following is a function that will send the bytes within a structure to the serial port as binary data:
The draw function in Processing works like loop in Arduino; it is called repeatedly. The code in draw checks if data is available on the serial port; if so, bytes are read and converted to the integer value represented by the bytes. A rectangle is drawn based on the integer values received.
You can send serial commands that contain the mouse cursor position to a program running on the target computer. Here is a sketch that moves the mouse cursor based on the position of two potentiometers:
This sketch assumes that a serial LCD has been connected to pins 2 and 3 as shown in Figure 4-5, and that a serial console is connected to the built-in port. The loop will repeatedly display the same message on each:
As you did in Recipe 4.13, create a NewSoftSerial object in your sketch and tell it which pins to control. In the following example, we define a soft serial port called serial_gps, using pins 2 and 3 for receive and transmit, respectively:
If you installed Processing on the same computer that is running the Arduino IDE, the only other thing you need to do is identify the serial port in Processing. The following Processing sketch prints the serial ports available:
Set the variable portIndex to match the port used by Arduino. You can see the port numbers printed in the Processing text window (the area below the source code, not the separate Display window; see ). Recipe 1.4 describes how to find out which serial port your Arduino board is using.
Documented ROS Serial is a point-to-point version of ROS communications over serial, primarily for integrating low-cost microcontrollers (Arduino) into ROS. ROS serial consists of a general p2p protocol, libraries for use with Arduino, and nodes for the PC/Tablet side (currently in both Python and Java).
Released Continuous Integration Documented Metapackage for core of rosserial.Maintainer status: developed
Maintainer: Michael Ferguson
Author: Michael Ferguson
License: BSD
Source: git -drivers/rosserial.git (branch: groovy-devel)
rosserial: rosserial_client rosserial_msgs rosserial_pythonPackage LinksTutorials
FAQ
Changelog
Change List
Reviews
Dependencies (4)catkin
rosserial_client
rosserial_msgs
rosserial_python
Used by (2)elevator
wheeled_robin_guided...
Package Summary Released Continuous Integration Documented Metapackage for core of rosserial.Maintainer status: maintained
Maintainer: Paul Bouchier , Mike Purvis
Author: Michael Ferguson
License: BSD
Source: git -drivers/rosserial.git (branch: hydro-devel)
rosserial: rosserial_client rosserial_msgs rosserial_pythonPackage LinksTutorials
FAQ
Changelog
Change List
Reviews
Dependencies (4)catkin
rosserial_client
rosserial_msgs
rosserial_python
Used by (1)forte_rc_driver
Package Summary Released Continuous Integration Documented Metapackage for core of rosserial.Maintainer status: maintained
Maintainer: Paul Bouchier , Mike Purvis
Author: Michael Ferguson
License: BSD
Source: git -drivers/rosserial.git (branch: indigo-devel)
rosserial: rosserial_client rosserial_msgs rosserial_pythonPackage LinksTutorials
FAQ
Changelog
Change List
Reviews
Dependencies (4)catkin
rosserial_client
rosserial_msgs
rosserial_python
Package Summary Released Continuous Integration Documented Metapackage for core of rosserial.Maintainer status: maintained
Maintainer: Paul Bouchier , Mike Purvis
Author: Michael Ferguson
License: BSD
Source: git -drivers/rosserial.git (branch: jade-devel)
rosserial: rosserial_client rosserial_msgs rosserial_pythonPackage LinksTutorials
FAQ
Changelog
Change List
Reviews
Dependencies (4)catkin
rosserial_client
rosserial_msgs
rosserial_python
Package Summary Released Continuous Integration Documented Metapackage for core of rosserial.Maintainer status: maintained
Maintainer: Paul Bouchier , Mike Purvis
Author: Michael Ferguson
License: BSD
Source: git -drivers/rosserial.git (branch: jade-devel)
rosserial: rosserial_client rosserial_msgs rosserial_pythonPackage LinksTutorials
FAQ
Changelog
Change List
Reviews
Dependencies (4)catkin
rosserial_client
rosserial_msgs
rosserial_python
Package Summary Released Continuous Integration Documented Metapackage for core of rosserial.Maintainer status: maintained
Maintainer: Paul Bouchier , Mike Purvis
Author: Michael Ferguson
License: BSD
Source: git -drivers/rosserial.git (branch: jade-devel)
rosserial: rosserial_client rosserial_msgs rosserial_pythonPackage LinksTutorials
FAQ
Changelog
Change List
Reviews
Dependencies (4)catkin
rosserial_client
rosserial_msgs
rosserial_python
Jenkins jobs (6)source ubuntu bionic
binary ubuntu bionic amd64
binary ubuntu bionic armhf
binary ubuntu bionic arm64
devel ubuntu bionic amd64
doc
Package Summary Released Continuous Integration: 12 / 12Build history (last 5 of 21 builds): #21 21-Aug-2020 21:11 12 / 12 #20 17-Apr-2020 17:11 12 / 12 #19 16-Apr-2020 20:11 12 / 12 #18 15-Apr-2020 15:11 12 / 12 #17 15-Apr-2020 02:11 12 / 12 Documented Metapackage for core of rosserial.Maintainer status: maintained
Maintainer: Paul Bouchier , Mike Purvis
Author: Michael Ferguson
License: BSD
Source: git -drivers/rosserial.git (branch: melodic-devel)
rosserial: rosserial_client rosserial_msgs rosserial_pythonPackage LinksTutorials
FAQ
Changelog
Change List
Reviews
Dependencies (4)catkin
rosserial_client
rosserial_msgs
rosserial_python
Jenkins jobs (10)source debian buster
source ubuntu focal
binary debian buster amd64
binary debian buster arm64
binary ubuntu focal amd64
binary ubuntu focal armhf
binary ubuntu focal arm64
devel debian buster amd64
devel ubuntu focal amd64
doc
Package Summary Released Continuous Integration: 14 / 14Build history (last 5 of 16 builds): #16 09-Sep-2020 16:40 14 / 14 #15 09-Sep-2020 15:40 14 / 14 #14 07-Sep-2020 14:40 14 / 14 #13 06-Sep-2020 03:40 14 / 14 #12 25-Aug-2020 23:40 14 / 14 Documented Metapackage for core of rosserial.Maintainer status: maintained
Maintainer: Paul Bouchier , Mike Purvis
Author: Michael Ferguson
License: BSD
Source: git -drivers/rosserial.git (branch: noetic-devel)
ContentsOverviewClient Libraries
ROS-side Interfaces
Examples and Use Cases
LimitationsMaximum Size of a Message, Maximum Number of Publishers/Subscribers
Float64
Strings
Arrays
ProtocolPacket Format
Topic Negotiation
Time
Report a Bug
Overviewrosserial is a protocol for wrapping standard ROS serialized messages and multiplexing multiple topics and services over a character device such as a serial port or network socket. In addition to a protocol definition, there are three types of packages found in this suite: Client LibrariesClient libraries allow users to easily get ROS nodes up and running on various systems. These clients are ports of the general ANSI C++ rosserial_client library. Currently, these packages include: rosserial_arduino support for Arduino compatible boards including UNO, Leonardo, MEGA, DUE, Teensy 3.x and LC, Spark, STM32F1, STM32Duino, ESP8266 and ESP32 rosserial_embeddedlinux support for Embedded Linux (eg, routers) rosserial_windows support for communicating with Windows applications rosserial_mbed support for mbed platforms rosserial_tivac support for TI's Launchpad boards, TM4C123GXL and TM4C1294XL rosserial_vex_v5 support for VEX V5 Robot Brain rosserial_vex_cortex support for VEX Cortex board rosserial_stm32 support for STM32 MCUs, based on STM32CubeMX HAL ros-teensy support for teensy platforms Refer to Adding Support for New Hardware for details on how to add a new hardware platform. ROS-side InterfacesDevices running rosserial code require a node on the host machine to bridge the connection from the serial protocol to the more general ROS network: rosserial_python A Python-based implementation (recommended for PC usage). rosserial_server A C++ implementation based on the ShapeShifter message, some limitations compared to rosserial_python but recommended for high-performance applications. Examples and Use CasesWe have created a number of extensions and examples: rosserial_arduino Tutorials - contains a number of examples of using various sensors and actuators with Arduino. This is the most well documented tutorial, and many of the feature depicted there can be extended into other platforms.
rosserial_xbee - tools for creating sensor networks using XBEE devices and Arduino.
rosserial_embeddedlinux Tutorials contains a number of examples of various sensors and actuators with an embedded linux system which cannot run full-blown ROS.
rosserial_mbed Tutorials - contains a number of examples of using various sensors and actuators with and Mbed platform.
rosserial_tivac Tutorials - Various examples for programming TI's TivaC Launchpad with Energia IDE or catkinized projects.
LimitationsMaximum Size of a Message, Maximum Number of Publishers/SubscribersThe number of Publishers and Subscribers are limited at 25, and the size of serialization and deserialization buffers are limited at 512 bytes by default for rosserial_client. However, those numbers and sizes are too big for microcontroller with limited SRAM. The buffer sizes, and numbers of Publisher/Subscriber for rosserial_arduino now vary depending on the chip used: AVR Model Input/Output buffer sizes Publishers/Subscribers ATMEGA168 150/150 bytes 6/6 ATMEGA328P 280/280 bytes 25/25 All others 512/512 bytes 25/25 You can change these numbers and sizes, refer to tutorial NodeHandle and ArduinoHardware for more informaiton. typedef NodeHandle_ NodeHandle;You should, however, be careful not to consume too much of the limited SRAM found in the Arduino. If the Arduino ran out of SRAM, it will simply hang with no debug information. Messages larger than the buffer size is not transmitted. A ROS error message will be relayed telling whether the message was coming from, or going to, the device. Float64The Arduino does not support 64-bit float datatypes. The serialization/deserialization code generated by make_library will automatically convert 64-bit floats into 32-bit datatypes, however, it should be noted that a loss of precision may occur! StringsTo conserve precious AVR memory, strings are not stored inside a message instance, instead an unsigned char * is stored. This has two impacts: When publishing, you must assign store the string data elsewhere and set the pointer: function isnumbered(obj) return obj.childNodes.length && obj.firstChild.childNodes.length && obj.firstChild.firstChild.className == 'LineNumber';function nformat(num,chrs,add) var nlen = Math.max(0,chrs-(''+num).length), res = ''; while (nlen>0) res += ' '; nlen-- return res+num+add;function addnumber(did, nstart, nstep) var c = document.getElementById(did), l = c.firstChild, n = 1; if (!isnumbered(c)) if (typeof nstart == 'undefined') nstart = 1; if (typeof nstep == 'undefined') nstep = 1; var n = nstart; while (l != null) if (l.tagName == 'SPAN') var s = document.createElement('SPAN'); var a = document.createElement('A'); s.className = 'LineNumber'; a.appendChild(document.createTextNode(nformat(n,4,''))); a.href = '#' + did + '_' + n; s.appendChild(a); s.appendChild(document.createTextNode(' ')); n += nstep; if (l.childNodes.length) l.insertBefore(s, l.firstChild); else l.appendChild(s); l = l.nextSibling; return false;function remnumber(did) var c = document.getElementById(did), l = c.firstChild; if (isnumbered(c)) while (l != null) if (l.tagName == 'SPAN' && l.firstChild.className == 'LineNumber') l.removeChild(l.firstChild); l = l.nextSibling; return false;function togglenumber(did, nstart, nstep) var c = document.getElementById(did); if (isnumbered(c)) remnumber(did); else addnumber(did,nstart,nstep); return false;document.write('Toggle line numbers'); 1 std_msgs::String str_msg; 2 unsigned char hello[13] = "hello world!"; 3 4 str_msg.data = hello;When subscribing to a message containing a string datatype, the string itself will not be copied from the deserialization buffer. Therefore, while it will be valid during the callback function, it will disappear when any other message is deserialized. If you need to keep the value of the string outside the callback, you must manually copy the string elsewhere. ArraysArrays have similar limitations to strings, however, since there is no easy way to find the termination of an array (analogous to the \0 found at the end of a string), we need to specify the size of the array. An extra variable is added to the class definition to accomplish this. For instance, the geometry_msgs/PoseArray is declared as: Header headergeometry_msgs/Pose[] posesOn the Arduino, this will translate to a class: document.write('Toggle line numbers'); 1 class PoseArray 2 3 Header header; 4 int poses_length; 5 Pose * poses; 6 Therefore, to send an array message, we have to set the length and pointer. When deserializing, we cannot deserialize in-place like the string (since the bytes of the message are actually packed, unlike a string which is passed in plain form). Therefore, the deserialization function will automatically allocate enough storage using realloc(), attempting to reuse the memory location whenever possible and only expanding it when the new message received is larger than the largest previous message. Some array types containing other array types will not deserialize correctly, as all elements of the child type will point to the same memory. This limitation may be addressed in the future. ProtocolThe rosserial protocol is aimed at point-to-point ROS communications over a serial transmission line. We use the same serialization/de-serialization as standard ROS messages, simply adding a packet header and tail which allows multiple topics to share a common serial link. This page describes the low-level details of the packet header and tail, and several special topics used for synchronization. Packet Format 1st Byte - Sync Flag (Value: 0xff) 2nd Byte - Sync Flag / Protocol version 3rd Byte - Message Length (N) - Low Byte 4th Byte - Message Length (N) - High Byte 5th Byte - Checksum over message length 6th Byte - Topic ID - Low Byte 7th Byte - Topic ID - High Byte x Bytes - Serialized Message Data Byte x+1 - Checksum over Topic ID and Message DataThe Protocol version byte was 0xff on ROS Groovy, 0xfe on ROS Hydro, Indigo, and Jade. Topics ID 0-100 are reserved for system functions, as defined in the rosserial_msgs/TopicInfo message. The checksums on the length and data are used to make sure that a particular packet has not been corrupted. The checksum over the message length is computed as follows: Message Length Checksum = 255 - ((Message Length High Byte + Message Length Low Byte) % 256 )The checksum over the Topic ID and data is computed as follows: Message Data Checksum = 255 - ((Topic ID Low Byte + Topic ID High Byte + Data byte values) % 256)Topic NegotiationBefore data transfer can begin, the PC/Tablet side must query the Arduino or other embedded device for the names and types of topics which will be published or subscribed to. Topic negotiation consists of a query for topics, a response with the number of topics, and packets to define each topic. The request for topics uses a topic ID of 0. The query for topics will look like: 0xff 0xfe 0x00 0x00 0xff 0x00 0x00 0xffA series of response packets (message type rosserial_msgs/TopicInfo, each containing information about a particular topic, with the following data in place of the serialized message: uint16 topic_id string topic_name string message_type string md5sum int32 buffer_sizeHere, the topic name is the name of the topic, for instance "cmd_vel", and message type is the type of the message, for instance "geometry_msgs/Twist". If a response packet is not received correctly, another query may be sent. MD5 checksums are transmitted to verify that both the sender and receiver are using the same message. TimeTime synchronization is handled by sending a std_msgs::Time in each direction. The embedded device can request the current time from the PC/Tablet by sending an empty Time message. The returned time is used to find clock offset. Report a BugReport bugs, ask questions in the issues list on github/rosserial Wiki: rosserial (last edited 2018-10-01 21:17:03 by RomainReignier) 2ff7e9595c
Comments