Update README.md
Signed-off-by: David Rotermund <54365609+davrot@users.noreply.github.com>
This commit is contained in:
parent
00f573f5cf
commit
9c62cc0fe1
1 changed files with 91 additions and 23 deletions
|
@ -12,10 +12,10 @@ We want to communicate with an Arduino from Python / Matlab.
|
||||||
|
|
||||||
Questions to [David Rotermund](mailto:davrot@uni-bremen.de)
|
Questions to [David Rotermund](mailto:davrot@uni-bremen.de)
|
||||||
|
|
||||||
Get the environment ready
|
## Get the environment ready
|
||||||
Before we can really interact with the Arduino board, we need to make the environment ready first:
|
Before we can really interact with the Arduino board, we need to make the environment ready first:
|
||||||
|
|
||||||
Download and install the Arduino IDE.
|
[Download](https://www.arduino.cc/en/software) and install the Arduino IDE.
|
||||||
Connect the Arduino via USB cable to the computer.
|
Connect the Arduino via USB cable to the computer.
|
||||||
Open the Arduino IDE.
|
Open the Arduino IDE.
|
||||||
Open the Blink example. Files -> Examples -> 01. Basics -> Blink
|
Open the Blink example. Files -> Examples -> 01. Basics -> Blink
|
||||||
|
@ -23,26 +23,32 @@ Check the setting: Tools-> Board and Tools->Port
|
||||||
Get the board information as a test: Tools -> Get Board Info
|
Get the board information as a test: Tools -> Get Board Info
|
||||||
Upload the sketch (means source code)
|
Upload the sketch (means source code)
|
||||||
|
|
||||||
|
![image0](Screenshot%202022-03-06%20163220_0.png)
|
||||||
|
|
||||||
The Arduino led should blink now.
|
The Arduino led should blink now.
|
||||||
|
|
||||||
If you use Python for controlling the Arduino, make sure that the serial package is installed:
|
If you use Python for controlling the Arduino, make sure that the serial package is installed:
|
||||||
|
|
||||||
|
```shell
|
||||||
pip install pyserial
|
pip install pyserial
|
||||||
WARNING: If you open a communication channel with Python / Matlab then a reset signal is created that resets the Arduino. Thus only open the communication once and keep it open as long as you require a connection to the Arduino.
|
```
|
||||||
|
|
||||||
|
***WARNING:*** If you open a communication channel with Python / Matlab then a reset signal is created that resets the Arduino. Thus only open the communication once and keep it open as long as you require a connection to the Arduino.
|
||||||
|
|
||||||
In the case that you are a VS code user, you want to add the Microsoft Arduino extension to VS code for editing the Arduino ino files in style and not like a caveperson with the Arduino IDE:
|
In the case that you are a VS code user, you want to add the Microsoft Arduino extension to VS code for editing the Arduino ino files in style and not like a caveperson with the Arduino IDE:
|
||||||
|
|
||||||
|
![image1](arduino_0.png)
|
||||||
|
|
||||||
|
|
||||||
|
## Controlling the LED
|
||||||
|
|
||||||
Controlling the LED
|
|
||||||
We want to control the LED on the Arduino board via an external software.
|
We want to control the LED on the Arduino board via an external software.
|
||||||
|
|
||||||
Note: I see it as a good style to make sure that we communicate in a fashion that reduces misunderstandings. Thus I will start any control sequence with the integer value 60 (the < symbol in ASCII) and end it with the integer value 62 (the > symbol in ASCII). The source code is prepared to handle up to 32x 8 bit integer values as payload. However we will only evaluate the value at index 0 in the switch case construct.
|
Note: I see it as a good style to make sure that we communicate in a fashion that reduces misunderstandings. Thus I will start any control sequence with the integer value 60 (the < symbol in ASCII) and end it with the integer value 62 (the > symbol in ASCII). The source code is prepared to handle up to 32x 8 bit integer values as payload. However we will only evaluate the value at index 0 in the switch case construct.
|
||||||
|
|
||||||
|
|
||||||
The Arduino sketch
|
The Arduino sketch
|
||||||
|
|
||||||
|
```c
|
||||||
int rc;
|
int rc;
|
||||||
boolean recvInProgress = false;
|
boolean recvInProgress = false;
|
||||||
|
|
||||||
|
@ -107,7 +113,11 @@ void loop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Python
|
Python
|
||||||
|
|
||||||
|
```python
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import time
|
import time
|
||||||
import serial
|
import serial
|
||||||
|
@ -137,7 +147,11 @@ for t in range(0, 100):
|
||||||
time.sleep(time_in_sec_until_change)
|
time.sleep(time_in_sec_until_change)
|
||||||
|
|
||||||
print("Done")
|
print("Done")
|
||||||
|
```
|
||||||
|
|
||||||
Matlab
|
Matlab
|
||||||
|
|
||||||
|
```matlab
|
||||||
time_in_sec_until_change = 0.5;
|
time_in_sec_until_change = 0.5;
|
||||||
|
|
||||||
ser = serialport('COM3', 115200);
|
ser = serialport('COM3', 115200);
|
||||||
|
@ -165,10 +179,13 @@ end
|
||||||
fprintf("Done\n")
|
fprintf("Done\n")
|
||||||
|
|
||||||
clear ser
|
clear ser
|
||||||
|
```
|
||||||
|
|
||||||
|
## Pulsing the LED for a defined time
|
||||||
|
|
||||||
Pulsing the LED for a defined time
|
|
||||||
The Arduino sketch
|
The Arduino sketch
|
||||||
|
|
||||||
|
```c
|
||||||
int rc;
|
int rc;
|
||||||
boolean recvInProgress = false;
|
boolean recvInProgress = false;
|
||||||
|
|
||||||
|
@ -246,8 +263,11 @@ void loop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Python
|
Python
|
||||||
|
|
||||||
|
```python
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import time
|
import time
|
||||||
import serial
|
import serial
|
||||||
|
@ -264,7 +284,11 @@ led_value_on: np.ndarray = np.array((start_marker, 1, stop_marker), dtype=np.uin
|
||||||
|
|
||||||
print("On")
|
print("On")
|
||||||
ser.write(led_value_on)
|
ser.write(led_value_on)
|
||||||
|
```
|
||||||
|
|
||||||
Matlab
|
Matlab
|
||||||
|
|
||||||
|
```matlab
|
||||||
ser = serialport('COM3', 115200);
|
ser = serialport('COM3', 115200);
|
||||||
% need to wait until the arduino is ready...
|
% need to wait until the arduino is ready...
|
||||||
% I tested with 1sec and it was not enough
|
% I tested with 1sec and it was not enough
|
||||||
|
@ -279,24 +303,27 @@ fprintf("On\n")
|
||||||
write(ser,led_value_on,"uint8")
|
write(ser,led_value_on,"uint8")
|
||||||
|
|
||||||
clear ser
|
clear ser
|
||||||
|
```
|
||||||
|
|
||||||
|
## PWM control of a pin
|
||||||
|
|
||||||
PWM control of a pin
|
|
||||||
Warning: On an Arduino Uno LED_BUILTIN is 13. But pins that support PWM on an Uno are 3, 5, 6, 9, 10, 11 and NOT 13.
|
Warning: On an Arduino Uno LED_BUILTIN is 13. But pins that support PWM on an Uno are 3, 5, 6, 9, 10, 11 and NOT 13.
|
||||||
|
|
||||||
With a output value of 64:
|
With a output value of 64:
|
||||||
|
|
||||||
|
![image2](NewFile1_0.png)
|
||||||
|
|
||||||
With a output value of 128:
|
With a output value of 128:
|
||||||
|
|
||||||
|
![image3](NewFile0_0.png)
|
||||||
|
|
||||||
With a output value of 192:
|
With a output value of 192:
|
||||||
|
|
||||||
|
![image4](NewFile2_0.png)
|
||||||
|
|
||||||
The Arduino sketch
|
The Arduino sketch
|
||||||
|
|
||||||
|
```c
|
||||||
int rc;
|
int rc;
|
||||||
boolean recvInProgress = false;
|
boolean recvInProgress = false;
|
||||||
|
|
||||||
|
@ -363,7 +390,11 @@ void loop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Python
|
Python
|
||||||
|
|
||||||
|
```python
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import time
|
import time
|
||||||
import serial
|
import serial
|
||||||
|
@ -384,7 +415,11 @@ led_control: np.ndarray = np.array(
|
||||||
)
|
)
|
||||||
print("Send...")
|
print("Send...")
|
||||||
ser.write(led_control)
|
ser.write(led_control)
|
||||||
|
```
|
||||||
|
|
||||||
Matlab
|
Matlab
|
||||||
|
|
||||||
|
```matlab
|
||||||
ser = serialport('COM3', 115200);
|
ser = serialport('COM3', 115200);
|
||||||
% need to wait until the arduino is ready...
|
% need to wait until the arduino is ready...
|
||||||
% I tested with 1sec and it was not enough
|
% I tested with 1sec and it was not enough
|
||||||
|
@ -401,8 +436,13 @@ fprintf('Send...')
|
||||||
write(ser,led_control,"uint8")
|
write(ser,led_control,"uint8")
|
||||||
|
|
||||||
clear ser
|
clear ser
|
||||||
Sending the internal clock
|
```
|
||||||
|
|
||||||
|
## Sending the internal clock
|
||||||
|
|
||||||
The Arduino sketch
|
The Arduino sketch
|
||||||
|
|
||||||
|
```c
|
||||||
int start_marker = 60; // <
|
int start_marker = 60; // <
|
||||||
int end_marker = 62; // >
|
int end_marker = 62; // >
|
||||||
|
|
||||||
|
@ -429,7 +469,11 @@ void loop() {
|
||||||
delay(1000);
|
delay(1000);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Python
|
Python
|
||||||
|
|
||||||
|
```python
|
||||||
import time
|
import time
|
||||||
import serial
|
import serial
|
||||||
|
|
||||||
|
@ -461,7 +505,10 @@ for i in range(0, read_number_of_values):
|
||||||
returned_value = returned_value << 8
|
returned_value = returned_value << 8
|
||||||
returned_value += s[1]
|
returned_value += s[1]
|
||||||
print(f"Arduino-clock in ms: {returned_value}")
|
print(f"Arduino-clock in ms: {returned_value}")
|
||||||
|
```
|
||||||
|
|
||||||
Matlab
|
Matlab
|
||||||
|
```matlab
|
||||||
ser = serialport('COM3', 115200);
|
ser = serialport('COM3', 115200);
|
||||||
% need to wait until the arduino is ready...
|
% need to wait until the arduino is ready...
|
||||||
% I tested with 1sec and it was not enough
|
% I tested with 1sec and it was not enough
|
||||||
|
@ -494,12 +541,16 @@ for i = [1:1:read_number_of_values],
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
clear ser
|
clear ser
|
||||||
Sending the time on a rising interrupt
|
```
|
||||||
Via attachInterrupt() we attach a function to an interrupt which is triggered when a low -> high transition on a defined pin ocures. Not every pin is capable of doing so. I will use pin 2 on the Uno. Please check attachInterrupt() for list of pins.
|
|
||||||
|
## Sending the time on a rising interrupt
|
||||||
|
|
||||||
|
Via [attachInterrupt()](https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/) we attach a function to an interrupt which is triggered when a low -> high transition on a defined pin ocures. Not every pin is capable of doing so. I will use pin 2 on the Uno. Please check [attachInterrupt()](https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/) for list of pins.
|
||||||
|
|
||||||
The software side is the same as in the previous example.
|
The software side is the same as in the previous example.
|
||||||
|
|
||||||
The Arduino sketch
|
The Arduino sketch
|
||||||
|
```c
|
||||||
int start_marker = 60; // <
|
int start_marker = 60; // <
|
||||||
int end_marker = 62; // >
|
int end_marker = 62; // >
|
||||||
|
|
||||||
|
@ -529,10 +580,13 @@ void loop() {
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Reading digital values on a rising interrupt
|
||||||
|
|
||||||
Reading digital values on a rising interrupt
|
|
||||||
The Arduino sketch
|
The Arduino sketch
|
||||||
|
|
||||||
|
```c
|
||||||
int start_marker = 60; // <
|
int start_marker = 60; // <
|
||||||
int end_marker = 62; // >
|
int end_marker = 62; // >
|
||||||
|
|
||||||
|
@ -567,7 +621,10 @@ void loop() {
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Python
|
```
|
||||||
|
|
||||||
|
Python:
|
||||||
|
```python
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import time
|
import time
|
||||||
import serial
|
import serial
|
||||||
|
@ -629,8 +686,12 @@ while True:
|
||||||
)
|
)
|
||||||
if counter_samples == read_number_of_values:
|
if counter_samples == read_number_of_values:
|
||||||
break
|
break
|
||||||
Reading analog values on a rising interrupt
|
```
|
||||||
|
|
||||||
|
## Reading analog values on a rising interrupt
|
||||||
|
|
||||||
The Arduino sketch
|
The Arduino sketch
|
||||||
|
```c
|
||||||
int start_marker = 60; // <
|
int start_marker = 60; // <
|
||||||
int end_marker = 62; // >
|
int end_marker = 62; // >
|
||||||
|
|
||||||
|
@ -664,10 +725,12 @@ void send_time(){
|
||||||
Serial.write(end_marker);
|
Serial.write(end_marker);
|
||||||
}
|
}
|
||||||
void loop() {
|
void loop() {
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Python
|
```
|
||||||
|
|
||||||
|
Python:
|
||||||
|
```python
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import time
|
import time
|
||||||
import serial
|
import serial
|
||||||
|
@ -731,7 +794,7 @@ while True:
|
||||||
)
|
)
|
||||||
if counter_samples == read_number_of_values:
|
if counter_samples == read_number_of_values:
|
||||||
break
|
break
|
||||||
|
```
|
||||||
|
|
||||||
## [Language Reference](https://www.arduino.cc/reference/en/)
|
## [Language Reference](https://www.arduino.cc/reference/en/)
|
||||||
|
|
||||||
|
@ -984,6 +1047,9 @@ while True:
|
||||||
|false|
|
|false|
|
||||||
|
|
||||||
### Communication
|
### Communication
|
||||||
|
|
||||||
|
||
|
||||||
|
|---|
|
||||||
|[Print](https://www.arduino.cc/reference/en/language/functions/communication/print/ ) |
|
|[Print](https://www.arduino.cc/reference/en/language/functions/communication/print/ ) |
|
||||||
|[Serial]( https://www.arduino.cc/reference/en/language/functions/communication/serial/) |
|
|[Serial]( https://www.arduino.cc/reference/en/language/functions/communication/serial/) |
|
||||||
|[SPI]( https://www.arduino.cc/reference/en/language/functions/communication/spi/) |
|
|[SPI]( https://www.arduino.cc/reference/en/language/functions/communication/spi/) |
|
||||||
|
@ -992,6 +1058,8 @@ while True:
|
||||||
|
|
||||||
### USB
|
### USB
|
||||||
|
|
||||||
|
||
|
||||||
|
|---|
|
||||||
|[Keyboard]( https://www.arduino.cc/reference/en/language/functions/usb/keyboard/) |
|
|[Keyboard]( https://www.arduino.cc/reference/en/language/functions/usb/keyboard/) |
|
||||||
|[Mouse]( https://www.arduino.cc/reference/en/language/functions/usb/mouse/) |
|
|[Mouse]( https://www.arduino.cc/reference/en/language/functions/usb/mouse/) |
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue