| .. include:: /substitutions.rst |
| .. _pysimcoder: |
| |
| pysimCoder integration with NuttX |
| ================================= |
| |
| `PysimCoder <https://github.com/robertobucher/pysimCoder>`_ is as an open source |
| Rapid Control Application Development Tool which is able to transfer block diagrams into C code. |
| Combined with NuttX, it can be used in real time control application and as an alternative to |
| expensive licensed programs and prototyping platforms. Example of `DC motor control application |
| <https://www.youtube.com/watch?v=6HlGk3ecPNQ>`_ with PID controller and blocks for encoder, |
| PWM, GPIO and sending data over TCP to real time plotter can be seen on `NuttX Channel |
| <https://www.youtube.com/channel/UC0QciIlcUnjJkL5yJJBmluw>`_. |
| |
| This documentation describes the steps that are needed to run application generated by pysimCoder |
| on NuttX and also keeps the track of peripherals that are supported by pysimCoder for NuttX RTOS. |
| |
| Peripheral Support |
| ------------------ |
| |
| The following list shows the peripherals and fuctionalities supported in pysimCoder for NuttX RTOS. |
| |
| ========== ======================= |
| Peripheral Notes |
| ========== ======================= |
| ADC |
| CAN Including SocketCAN |
| DAC |
| ENC |
| GPIO |
| PWM Multichannel support |
| UART Serial output |
| Sensors Basic support for DHTXX |
| TCP |
| UDP |
| ========== ======================= |
| |
| Please note that the actual support for NuttX peripherals can be wider that what is mentioned here |
| in case this documentation was not updated when new fuctionalities were added to pysimCoder. |
| |
| NuttX Configuration |
| ------------------- |
| |
| Several configuration options are neccessary to be set in order to succesfully compile pysimCoder |
| with NuttX. The list is the following: |
| |
| ==================================== ===================================== |
| ``CONFIG_ARCH_RAMVECTORS=y`` ``CONFIG_NSH_FILE_APPS=y`` |
| ``CONFIG_BOARDCTL_APP_SYMTAB=y`` ``CONFIG_NSH_LINELEN=64`` |
| ``CONFIG_BOARDCTL_OS_SYMTAB=y`` ``CONFIG_NSH_READLINE=y`` |
| ``CONFIG_BUILTIN=y`` ``CONFIG_NSH_ROMFSETC=y`` |
| ``CONFIG_CLOCK_MONOTONIC=y`` ``CONFIG_PSEUDOTERM=y`` |
| ``CONFIG_ELF=y`` ``CONFIG_PTHREAD_CLEANUP=y`` |
| ``CONFIG_FS_BINFS=y`` ``CONFIG_PTHREAD_MUTEX_TYPES=y`` |
| ``CONFIG_FS_PROCFS=y`` ``CONFIG_PTHREAD_MUTEX_TYPES=y`` |
| ``CONFIG_FS_PROCFS_REGISTER=y`` ``CONFIG_PTHREAD_STACK_MIN=1024`` |
| ``CONFIG_FS_ROMFS=y`` ``CONFIG_RR_INTERVAL=10`` |
| ``CONFIG_FS_TMPFS=y`` ``CONFIG_SCHED_WAITPID=y`` |
| ``CONFIG_IDLETHREAD_STACKSIZE=2048`` ``CONFIG_SERIAL_TERMIOS=y`` |
| ``CONFIG_LIBC_EXECFUNCS=y`` ``CONFIG_SYMTAB_ORDEREDBYNAME=y`` |
| ``CONFIG_LIBC_STRERROR=y`` ``CONFIG_SYSTEM_NSH=y`` |
| ``CONFIG_MAX_TASKS=16`` ``CONFIG_SYSTEM_NSH_STACKSIZE=4096`` |
| ``CONFIG_NSH_BUILTIN_APPS=y`` ``CONFIG_USER_ENTRYPOINT="nsh_main"`` |
| ``CONFIG_NSH_FILEIOSIZE=512`` |
| ==================================== ===================================== |
| |
| In case you want to use Network and blocks like TCP or UDP, following configuration |
| options are required: |
| |
| ============================== ================================== |
| ``CONFIG_NET=y`` ``CONFIG_NET_ROUTE=y`` |
| ``CONFIG_NETDB_DNSCLIENT=y`` ``CONFIG_NET_SOLINGER=y`` |
| ``CONFIG_NETDEV_LATEINIT=y`` ``CONFIG_NET_STATISTICS=y`` |
| ``CONFIG_NETDEV_STATISTICS=y`` ``CONFIG_NET_TCP=y`` |
| ``CONFIG_NETINIT_DHCPC=y`` ``CONFIG_NET_TCPBACKLOG=y`` |
| ``CONFIG_NETINIT_NOMAC=y`` ``CONFIG_NET_TCP_KEEPALIVE=y`` |
| ``CONFIG_NETUTILS_FTPC=y`` ``CONFIG_NET_TCP_WRITE_BUFFERS=y`` |
| ``CONFIG_NETUTILS_TELNETD=y`` ``CONFIG_NET_UDP=y`` |
| ``CONFIG_NETUTILS_TFTPC=y`` ``CONFIG_SYSTEM_DHCPC_RENEW=y`` |
| ``CONFIG_NET_ARP_SEND=y`` ``CONFIG_SYSTEM_NTPC=y`` |
| ``CONFIG_NET_BROADCAST=y`` ``CONFIG_SYSTEM_PING6=y`` |
| ``CONFIG_NET_IPv6=y`` ``CONFIG_SYSTEM_PING=y`` |
| ``CONFIG_NET_LOOPBACK=y`` ``CONFIG_SYSTEM_TEE=y`` |
| ``CONFIG_NET_PKT=y`` |
| ============================== ================================== |
| |
| Board and application specific configuration like setting up peripherals or boot options might also be required, |
| please refer to board and platform documentation for those information. Once NuttX is configured it can be build |
| by simply running: |
| |
| .. code-block:: console |
| |
| $ make |
| |
| Then we need to export build NuttX which can be done by executing command |
| |
| .. code-block:: console |
| |
| $ make export |
| |
| This creates a zip file nuttx-export-xx.x.x.zip where xx.x.x is the version of NuttX. This file then have to be |
| moved to pysimCoder directory pysimCoder/CodeGen/nuttx, unzip there and then renamed just to nuttx-export. Then |
| enter the pysimCoder/CodeGen/nuttx/device directory and execute |
| |
| .. code-block:: console |
| |
| $ make |
| |
| This compiles pysimCoder files that controls functions of separate blocks. PysimCoder can be either installed |
| on the system (please refer to the `pysimCoder manual <https://github.com/robertobucher/pysimCoder/blob/master/README.md>`_) |
| or script pysim-run.sh can be used to run pysimCoder without the installation. This script can be found in pysimCoder |
| root directory and is run by executing command |
| |
| .. code-block:: console |
| |
| $ ./pysim-run.sh |
| |
| Please note that PYSUPSICTRL variable has to be set/exported in order to succesfully compile NuttX application |
| designed with pysimCoder. |
| |
| Using pysimCoder to design NuttX application |
| -------------------------------------------- |
| |
| After running pysimCoder, separate blocks can be selected from the library menu on the left hand side. The menu contains |
| several libraries, NuttX specific blocks can be found in library "NuttX". It is also possible to use blocks from other |
| libraries like "input", "output", "math" and so on. Several blocks can have specific parameter options and various number |
| of inputs/outputs. Double left click on the block openes parameter settings while single right click on the block leads |
| to number of inputs/outputs setup. The pysimCoder interface can be seen in the picture below. |
| |
| .. figure:: image/interface.png |
| :align: center |
| :width: 100% |
| |
| pysimCoder interface: library menu can be seen on the left hand side |
| |
| The NuttX template Makefile nuttx.tmf has to be selected in order to generate code for NuttX target. |
| This can be done in the top menu by clicking on Block settings icon which is highlighted in the red circle. |
| |
| .. figure:: image/menu.png |
| :align: center |
| :width: 100% |
| |
| pysimCoder menu: red block settings, green generate C-code |
| |
| Block settings option open the following window (showed in the picture below) where you can set template Makefile and |
| also Python skript with parameters for the controllers. |
| |
| .. figure:: image/template.png |
| :align: center |
| :width: 100% |
| |
| pysimCoder Block settings menu |
| |
| C code can be generated by selecting Generate C-code icon (highlighted in the green cirle). Executeble files are then |
| generated and can be flashed into the target. The flashing procedure can be target specific, please refer to plaftorm´s |
| documentation. The generated application can be then run from NuttX command line by executing:: |
| |
| nsh> main |