Data acquisition and device control with Scilab.

Dependencies:   Servo MPU6050

Desciription

Scilab is a freeware alternative to MATLAB. For low-cost data acquisition and device control a nice Arduino toolbox is available.

https://os.mbed.com/media/uploads/hudakz/scilab.png

This site presents a Mbed port which allows to use Mbed boards (equipped with Arduino header) rather than Arduino to import real time data into Scilab and to control real equipment witch Scilab.

https://os.mbed.com/media/uploads/hudakz/arduino-temp-read_imagelarge_1.jpeg

Installation
  • Install Scilab to your PC, if not done yet.
  • Launch Scilab and install the Arduino toolbox by executing the following command from the Scilab console:

--> atomsInstall("arduino")
Controlling Mbed's digital output from Scilab
  • In Xcos open examples/Arduino1.zcos

/media/uploads/hudakz/scilab_arduino1.png

  • Double click on the Board setup block and replace the serial port number with mbed's actual virtual serial port number.
  • Double click on the Digital WRITE block and set Digital Pin to 13 (D13 is connected to LED1).
  • Start simulation and LED1 on the Mbed board should start blinking.
Reading and displaying Mbed's analog input
  • In Xcos open examples/Arduino2.zcos

/media/uploads/hudakz/scilab_arduino2.png

  • Double click on the Board setup block and replace the serial port number with mbed's actual virtual serial port number.
  • Double click on the Analog READ block and set Analog Pin to 2.
  • Start simulation and a graph should appear showing the analog signal measured on Mbed's pin A2.

NOTE: Currently, there is bug in the toolbox ARDUINO_ANALOG_READ_sim function (I have reported to Scilab) so the analog readings are not correct.

/media/uploads/hudakz/scilab_graph.png

PID controller
  • In Xcos open examples/Arduino9.zcos

/media/uploads/hudakz/scilab_arduino9.png

Revision:
0:295b7e1c12f3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ScilabSerial/Encoder.cpp	Mon Jan 18 19:51:22 2021 +0000
@@ -0,0 +1,65 @@
+#include "Encoder.h"
+
+/**
+ * @brief   The Encoder class
+ * @note    Rotary encoder with three operating modes
+ */
+Encoder::Encoder(PinName pinA, PinName pinB, int mode) : _position(0)
+{
+    switch (mode) {
+        case 1:
+            _chanA = new InterruptIn(pinA);
+            _chanA->rise(callback(this, &Encoder::onRiseMode1));
+            _chanB = new InterruptIn(pinB);
+            break;
+
+        case 2:
+            _chanA = new InterruptIn(pinA);
+            _chanA->rise(callback(this, &Encoder::onChangeMode2));
+            _chanA->fall(callback(this, &Encoder::onChangeMode2));
+            _chanB = new InterruptIn(pinB);
+            break;
+
+        case 4:
+            _chanA = new InterruptIn(pinA);
+            _chanA->rise(callback(this, &Encoder::onChangeMode2));
+            _chanA->fall(callback(this, &Encoder::onChangeMode2));
+            _chanB = new InterruptIn(pinB);
+            _chanB->rise(callback(this, &Encoder::onChangeMode2));
+            _chanB->fall(callback(this, &Encoder::onChangeMode2));
+            break;
+    }
+}
+
+Encoder::~Encoder()
+{
+    delete _chanA;
+    delete _chanB;
+}
+
+void Encoder::onRiseMode1()
+{
+    int b = _chanB->read();
+    if (b)
+        _position--;
+    else
+        _position++;
+}
+void Encoder::onChangeMode2()
+{
+    int a = _chanA->read();
+    int b = _chanB->read();
+    if ((a && !b) || (!a && b))
+        _position++;
+    else
+        _position--;
+}
+void Encoder::onChangeMode4()
+{
+    int a = _chanA->read();
+    int b = _chanB->read();
+    if ((a && !b) || (!a && b))
+        _position++;
+    else
+        _position--;
+}