Markdown source

# Prove con la gestione realtime dei GPIO della Raspberry Pi

<abstract>
In questo articolo sto inserendo un pò di appunti sulla libreria rpgpio.py che consente 
di generare segnali su GPIO tramite DMA in modo che non ci siano time lack dovuti al sistema 
operativo e che le CPU siano completamente scariche e disponibili per il sistema operativo e le
applicazioni utente.
</abstract>

Di seguito alcune prove che ho effettuato salvando solo i due file:

* [rpgpio_private.py](./rpgpio_private.py)
* [rpgpio.py](./rpgpio.py)

e scrivendo di volta in volta il pezzetto di codice d'esempio in un file chiamato __prova.py__. Per lanciarlo:

	sudo python prova.py

## Prova base su una linea GPIO

Invia dieci impulsi da un secondo usando la libreria rpgpio. Qui il realtime non c'entra ancora nulla.

	from rpgpio import GPIO
	import time
	
	pin = 21
	g= GPIO()
	
	for i in range(10):
		g.init(pin, GPIO.MODE_OUTPUT)
		g.set(pin)
		print("set " + str(g.read(pin)))
		time.sleep(1)
		g.clear(pin)
		print("clear " + str(g.read(pin)))
		time.sleep(1)


Il sorgente della classe __GPIO()__ è qui:

* <https://github.com/Nikolay-Kha/PyCNC/blob/master/cnc/hal_raspberry/rpgpio.py#L10>

## Test di allocazione di memoria

Alloca memoria, ci scrive sopra e controlla e rilegge cosa ha scritto. Anche qui il realtime non c'entra ancora nulla :-).

	from rpgpio_private import *
	
	cma = CMAPhysicalMemory(1*1024*1024)
	print(str(cma.get_size() / 1024 / 1024) + "MB of memory allocated at "
		  + hex(cma.get_phys_address()))
	a = cma.read_int(0)
	print("was " + hex(a))
	cma.write_int(0, 0x12345678)
	a = cma.read_int(0)
	assert a == 0x12345678, "Memory isn't written or read correctly"
	print("now " + hex(a))
	del cma

Il sorgente della funzione __CMAPhysicalMemory()__ è qui:

* <https://github.com/Nikolay-Kha/PyCNC/blob/master/cnc/hal_raspberry/rpgpio_private.py#L151>


## Invio impulsi via DMA

Primo esempio per generare impulsi. Genera impulsi da 2 uS sul pin GPIO21. 

Sembra che la risoluzione minima sia 2 uS, se provo a mettere 1uS non scende al di sotto dei 2 uS.

	from rpgpio import DMAGPIO,GPIO
	import sys
	
	pin = 21
	g=GPIO()
	g.init(pin, GPIO.MODE_OUTPUT)
	
	dg = DMAGPIO()
	dg.add_pulse(1 << pin, 2)
	dg.add_delay(2)
	dg.run(True)
	print("dmagpio is started")
	try:
		print("press enter to stop...")
		sys.stdin.readline()
	except KeyboardInterrupt:
		pass
	dg.stop()
	g.clear(pin)
	print("dma stopped")

Il sorgente della classe __DMAGPIO()__ è qui:

* <https://github.com/Nikolay-Kha/PyCNC/blob/master/cnc/hal_raspberry/rpgpio.py#L80>



## Pinout della Raspberry Pi

<img src="./raspberry_pinout.jpg" width="60%">

## Links

* [Sorgenti del progetto PyCNC](https://github.com/Nikolay-Kha/PyCNC)
* [Commenti su PyCNC sul forum Raspberry](https://www.raspberrypi.org/forums/viewtopic.php?t=183677)
* Video
	* [CNC machine controller implementation in Python](https://www.youtube.com/watch?v=vcedo59raS4)
	* [PyCNC is working as a 3D printer.](https://www.youtube.com/watch?v=41wdmmztTNA&t=13s)
* MagiDeal 42/57/86 TB6600 Stepper motor controller
	* [Amazon](https://www.amazon.it/MagiDeal-Passo-Passo-Segmenti-Aggiornato-Controller/dp/B0719NWFR1)
	* [Product description](https://www.dfrobot.com/wiki/index.php/TB6600_Stepper_Motor_Driver_SKU:_DRI0043)
	* [User Guide](https://github.com/Arduinolibrary/TB6600_Stepper_Motor_Driver/raw/master/TB6600%20User%20Guide%20V1.2.pdf)
	* [Datasheet Toshiba TB6600HG](http://www.mouser.com/ds/2/408/TB6600HG_datasheet_en_20160610-771376.pdf)
	* [Schema interno](http://www.cuteminds.com/en/elettronicagen/elettronica/46-controller-bipolare-toshiba-tb6600hq-hg)
* Driver a Mosfet	
	* [Toshiba TB67S249FTG](http://www.mouser.com/ds/2/408/TB67S249FTG_datasheet_en_20170818-1147645.pdf) 
	* Articolo sulla tecnologia usata <https://community.arm.com/soc/b/blog/posts/bcd---the-most-interesting-process-technology-you-haven-t-heard-of>
* [GCode simulator](https://nraynaud.github.io/webgcode/)
* Soluzioni CNC 
	* [Gestalt and the Modular Machines](http://archive.monograph.io/james/m-mtm) 
	* [A Gestalt Framework for Virtual Machine Control of Automated Tools](http://www.pygestalt.org/VMC_IEM.pdf)
	* [Raspberry Pi Alamode CNC Controller](http://www.instructables.com/id/Raspberry-Pi-Alamode-CNC-Controller/)
	* [Raspberry Pi CNC](http://wiki.protoneer.co.nz/Raspberry_Pi_CNC)
* Soluzioni print 3D 
	* [Gestalt and the Modular Machines that Make](https://3dprinting.com/3dprinters/gestalt-modular-machines-make/)
	* [NanoDLP](https://www.nanodlp.com/) Software di slicing su RaspBerry per stampanti 3D a resina
* Componenti Meccanici
	* [Trapezoidal thread form](https://en.wikipedia.org/wiki/Trapezoidal_thread_form#Acme_thread_characteristics)
* Datasheet componenti Elettronici
	* [TB6600 4a cnc 32 segmenti 42V 42/57/86 stepper motor driver del controller](https://www.banggood.com/it/TB6600-4A-CNC-32-Segments-42V-425786-Stepper-Motor-Driver-Controller-p-1093437.html?rmmds=detail-left-hotproducts) 
	* [Datasheet Raspberry Pi Compute Module 3 Lite (CM3L)](https://www.raspberrypi.org/documentation/hardware/computemodule/RPI-CM-DATASHEET-V1_0.pdf)

## Altri link

* Soluzioni basate su Arduino
	* [Alligator](http://www.3dartists.org/#project)
	* [Smoothieboards](http://smoothieware.org/smoothieboard)
	* [Replicape Rev B](https://www.thing-printer.com/product/replicape/) 
	* [Ramps](http://reprap.org/wiki/File:RAMPS1-3_fin.JPG) Controllo di potenza basato su Arduino
	* [GRBL firmware](https://github.com/grbl/grbl/wiki)
	* [Marlin firmware](http://marlinfw.org/)

* Host vari per GRBL [esempio bCNC](https://github.com/vlachoudis/bCNC/wiki)
* [OctoPrint](http://octoprint.org/) 
* [TMC2100](https://www.digikey.it/product-detail/it/trinamic-motion-control-gmbh/TMC2100-LA-T/1460-1128-1-ND/5144063)
* [Raspberry Pi Alamode CNC Controller](http://www.instructables.com/id/Raspberry-Pi-Alamode-CNC-Controller/)
* [Raspberry Pi CNC](http://wiki.protoneer.co.nz/Raspberry_Pi_CNC)
 
@include='bio_sergio_tanzilli'