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

ScilabSerial/ScilabSerial.h

Committer:
hudakz
Date:
2021-01-18
Revision:
0:295b7e1c12f3

File content as of revision 0:295b7e1c12f3:

#ifndef SCILABSERIAL_H
#define SCILABSERIAL_H

#include "mbed.h"
#include "Servo.h"
#include "IntrInCounter.h"
#include "Encoder.h"
#include "DcMotor.h"
#include "MPU6050.h"

//#define USBSERIAL
#define RX_MAX  64

#ifdef USBSERIAL
#include "USBSerial.h"
//#include "stm32f103c8t6.h"
#endif
/**
 * @brief   The PcSerial class
 * @note    For serial communication with PC
 */
#ifdef USBSERIAL
class PcSerial :
    public USBSerial
{
public:
    PcSerial() :
    USBSerial(0x1f00, 0x2012, 0x0001, false)
    {
        rxDataLen = 0;
        attach(this, &PcSerial::onRx);
    }

    void onRx()
    {
        memset(rxData, 0, RX_MAX);
        while (available()) {
            char    c = _getc();
            if (c != '\n') {
                if (rxDataLen >= RX_MAX)
                    rxDataLen = 0;  // rxBuf overflow
                rxData[rxDataLen++] = c;
            }
        }
    }

    ssize_t         write(const void* buffer, size_t length)    { return writeBlock((uint8_t*)buffer, length); }
    char            rxData[RX_MAX];
    volatile size_t rxDataLen;
};
#else
class ScilabSerial :
    public SerialBase
{
    bool            _rxComplete;
    char            _rxBuf[RX_MAX];
    volatile size_t _rxBufLen;
    char            _rxData[RX_MAX];
    volatile size_t _rxDataLen;

#if defined(TARGET_BLUEPILL)
    PinName         _digitalPinName[16] = { NC, NC, D2, D3, D4, D5, D6, D7, D8, NC, D10, D11, D12, D13, D14, D15 };
    PinName         _analogPinName[6] = { A0, A1, A2, A3, NC, NC };
#elif defined(TARGET_BLACKPILL)
    PinName         _digitalPinName[16] = { NC, NC, D2, D3, D4, D5, D6, D7, D8, NC, D10, D11, D12, D13, D14, D15 };
    PinName         _analogPinName[6] = { A0, A1, A2, A3, NC, NC };
#else
    PinName         _digitalPinName[16] = { NC, NC, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15 };
    PinName         _analogPinName[6] = { A0, A1, A2, A3, A4, A5 };
#endif
    DigitalInOut*   _digitalInOuts[8];
    AnalogIn*       _analogIns[6];
    PwmOut*         _pwmOuts[4];
    IntrInCounter*  _intrInCounters[8];
    Servo*          _servos[2];
    Encoder*        _encoders[2];
    DcMotor*        _dcMotors[2];
    MPU6050*        _mpu6050;
    Timer           _mpu6050Timer;
    uint32_t        _now;
    float           _deltaT;
    bool            _mpu6050Available;
public:

    ScilabSerial(PinName tx, PinName rx, int baud = 115200);

    void    run();
    void    onRx();
    ssize_t write(const void* buffer, size_t length);
    void    analogRead();
    void    pwmWrite();
    void    digitalReadWrite();
    void    servo();
    void    mpu6050();
    void    intrInCounter();
    void    encoder();
    void    dcMotorInit();
    void    dcMotor();
    void    revision();
    void    mpu6050UpdateData();
};
#endif
#endif // SCILABSERIAL_H