No changes between revisions
/Designs/Laboratory_instruments/CLOCKMOT01A/DOC/SRC/CLOCKMOT01A.html.in |
---|
0,0 → 1,26 |
<html> |
<head> |
<meta charset=utf-8/> |
<link rel="stylesheet" type="text/css" href="/home/ondra6ak/Documents/mlabgen/style.css"> |
<title> |
Mlab|$HumanName |
</title> |
<script type="text/x-mathjax-config"> |
MathJax.Hub.Config({extensions: ["asciimath2jax.js"], |
jax: ["input/AsciiMath", "output/CommonHTML"], |
asciimath2jax: {delimiters: [['$M','M$']]}, |
CommonHTML: {mtextFontInherit: true}, |
showProcessingMessages: false, |
messageStyle: "none", |
showMathMenu: false}); |
</script> |
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script> |
</head> |
</head> |
<body> |
$Text |
</body> |
</html> |
/Designs/Laboratory_instruments/CLOCKMOT01A/DOC/SRC/CLOCKMOT01A.md.in |
---|
0,0 → 1,37 |
$HumanName |
========== |
Brought to you by: $Author |
$Descr |
Specifications |
-------------- |
Specification | Value | Unit | Note |
----------------- | ------------- | ---- | -------------- |
Operating Voltage | | V | |
Power Consumption | | mA | |
Dimensions | $Dimensions | mm | width x length |
Description |
----------- |
!9.9;9.9;287.1;200.1;!(../SCH_PCB/${Module}_SCH.svg) |
Mechanical construction |
----------------------- |
Component placement |
------------------- |
![PCB top](../../CAM_AMA/${Module}_TOP.svg "Top side of a PCB") ![PCB bottom](../../CAM_AMA/${Module}_BOT.svg "Bottom side of a PCB") |
$bom |
First power up |
-------------- |
Programming |
---------- |
/Designs/Laboratory_instruments/CLOCKMOT01A/Makefile |
---|
0,0 → 1,8 |
TARGETS = DOC/$(MODULE).html \ |
DOC/SRC/$(MODULE).md \ |
PrjInfo.txt \ |
DOC/$(MODULE).pdf |
MATHJAX = /home/ondra6ak/Documents/MathJax/MathJax.js |
include mlabgen.mk |
/Designs/Laboratory_instruments/CLOCKMOT01A/PrjInfo.txt.in |
---|
0,0 → 1,13 |
[HumanName] |
Human friendly name of the module |
[BuyLinkTindie] |
Link to module's page on Tindie. |
[BuyLinkUST] |
Link to module's page on Universal Scientific Technologies. |
[Dev] |
True |
[End] |
/Designs/Laboratory_instruments/CLOCKMOT01A/SW/CLOCKMOT.py |
---|
0,0 → 1,200 |
#!/usr/bin/python |
# ------------------------------------------- |
# HBSTEP01B Stepper Motor control test code |
# ------------------------------------------- |
# |
# Program uses MLAB Python modules library from https://github.com/MLAB-project/pymlab |
#uncomment for debbug purposes |
#import logging |
#logging.basicConfig(level=logging.DEBUG) |
import sys |
import time |
from pymlab import config |
#### Script Arguments ############################################### |
if len(sys.argv) < 2: |
sys.stderr.write("Invalid number of arguments.\n") |
sys.stderr.write("Usage: %s PORT ADDRESS SPEED MOVE_DISTANCE\n" % (sys.argv[0], )) |
sys.exit(1) |
elif len(sys.argv) == 2: |
PORT = eval(sys.argv[1]) |
SPEED = 5 |
DISTANCE = 50 |
elif len(sys.argv) == 3: |
SPEED = eval(sys.argv[2]) |
DISTANCE = 100 |
elif len(sys.argv) == 4: |
SPEED = eval(sys.argv[2]) |
DISTANCE = eval(sys.argv[3]) |
else: |
PORT = 0 |
SPEED = 10 |
DISTANCE = 50 |
class axis: |
def __init__(self, SPI_CS, Direction, StepsPerUnit): |
' One axis of robot ' |
self.CS = SPI_CS |
self.Dir = Direction |
self.SPU = StepsPerUnit |
self.Reset() |
def Reset(self): |
' Reset Axis and set default parameters for H-bridge ' |
spi.SPI_write_byte(self.CS, 0xC0) # reset |
# spi.SPI_write_byte(self.CS, 0x14) # Stall Treshold setup |
# spi.SPI_write_byte(self.CS, 0xFF) |
# spi.SPI_write_byte(self.CS, 0x13) # Over Current Treshold setup |
# spi.SPI_write_byte(self.CS, 0xFF) |
spi.SPI_write_byte(self.CS, 0x15) # Full Step speed |
spi.SPI_write_byte(self.CS, 0xFF) |
spi.SPI_write_byte(self.CS, 0xFF) |
spi.SPI_write_byte(self.CS, 0x05) # ACC |
spi.SPI_write_byte(self.CS, 0x00) |
spi.SPI_write_byte(self.CS, 0x10) |
spi.SPI_write_byte(self.CS, 0x06) # DEC |
spi.SPI_write_byte(self.CS, 0x00) |
spi.SPI_write_byte(self.CS, 0x10) |
spi.SPI_write_byte(self.CS, 0x0A) # KVAL_RUN |
spi.SPI_write_byte(self.CS, 0xFF) |
spi.SPI_write_byte(self.CS, 0x0B) # KVAL_ACC |
spi.SPI_write_byte(self.CS, 0xFF) |
spi.SPI_write_byte(self.CS, 0x0C) # KVAL_DEC |
spi.SPI_write_byte(self.CS, 0xFF) |
spi.SPI_write_byte(self.CS, 0x18) # CONFIG |
spi.SPI_write_byte(self.CS, 0b00111000) |
spi.SPI_write_byte(self.CS, 0b00000000) |
def MaxSpeed(self, speed): |
' Setup of maximum speed ' |
spi.SPI_write_byte(self.CS, 0x07) # Max Speed setup |
spi.SPI_write_byte(self.CS, 0x00) |
spi.SPI_write_byte(self.CS, speed) |
def ReleaseSW(self): |
' Go away from Limit Switch ' |
while self.ReadStatusBit(2) == 1: # is Limit Switch ON ? |
spi.SPI_write_byte(self.CS, 0x92 | (~self.Dir & 1)) # release SW |
while self.IsBusy(): |
pass |
self.MoveWait(10) # move 10 units away |
def GoZero(self, speed): |
' Go to Zero position ' |
self.ReleaseSW() |
spi.SPI_write_byte(self.CS, 0x82 | (self.Dir & 1)) # Go to Zero |
spi.SPI_write_byte(self.CS, 0x00) |
spi.SPI_write_byte(self.CS, speed) |
while self.IsBusy(): |
pass |
time.sleep(0.3) |
self.ReleaseSW() |
def Move(self, units): |
' Move some distance units from current position ' |
steps = units * self.SPU # translate units to steps |
if steps > 0: # look for direction |
spi.SPI_write_byte(self.CS, 0x40 | (~self.Dir & 1)) |
else: |
spi.SPI_write_byte(self.CS, 0x40 | (self.Dir & 1)) |
steps = int(abs(steps)) |
spi.SPI_write_byte(self.CS, (steps >> 16) & 0xFF) |
spi.SPI_write_byte(self.CS, (steps >> 8) & 0xFF) |
spi.SPI_write_byte(self.CS, steps & 0xFF) |
def MoveWait(self, units): |
' Move some distance units from current position and wait for execution ' |
self.Move(units) |
while self.IsBusy(): |
pass |
def Float(self): |
' switch H-bridge to High impedance state ' |
spi.SPI_write_byte(self.CS, 0xA0) |
def ReadStatusBit(self, bit): |
' Report given status bit ' |
spi.SPI_write_byte(self.CS, 0x39) # Read from address 0x19 (STATUS) |
spi.SPI_write_byte(self.CS, 0x00) |
data0 = spi.SPI_read_byte() # 1st byte |
spi.SPI_write_byte(self.CS, 0x00) |
data1 = spi.SPI_read_byte() # 2nd byte |
#print hex(data0), hex(data1) |
if bit > 7: # extract requested bit |
OutputBit = (data0 >> (bit - 8)) & 1 |
else: |
OutputBit = (data1 >> bit) & 1 |
return OutputBit |
def IsBusy(self): |
""" Return True if tehre are motion """ |
if self.ReadStatusBit(1) == 1: |
return False |
else: |
return True |
# End Class axis -------------------------------------------------- |
cfg = config.Config( |
i2c = { |
"port": 1, |
}, |
bus = [ |
{ |
"name":"spi", |
"type":"i2cspi", |
"address": 0x2e, |
}, |
], |
) |
cfg.initialize() |
print "Stepper motor control test started. \r\n" |
print "Max motor speed: %d " % SPEED |
print "Distance to run: %d " % DISTANCE |
spi = cfg.get_device("spi") |
spi.route() |
try: |
print "SPI configuration.." |
spi.SPI_config(spi.I2CSPI_MSB_FIRST| spi.I2CSPI_MODE_CLK_IDLE_HIGH_DATA_EDGE_TRAILING| spi.I2CSPI_CLK_461kHz) |
time.sleep(1) |
print "Axis inicialization" |
X = axis(spi.I2CSPI_SS0, 0, 641) # set Number of Steps per axis Unit and set Direction of Rotation |
X.MaxSpeed(SPEED) # set maximal motor speed |
print "Axis is running" |
for i in range(5): |
print i |
X.MoveWait(DISTANCE) # move forward and wait for motor stop |
print "Changing direction of rotation.." |
X.MoveWait(-DISTANCE) # move backward and wait for motor stop |
print "Changing direction of rotation.." |
X.Float() # release power |
finally: |
print "stop" |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/Modules/Sensors/SHT25V01A/pdf/SHT25.pdf |
---|
1,241 → 1,820 |
%PDF-1.5 |
%µµµµ |
1 0 obj |
<</Type/Catalog/Pages 2 0 R/Lang(de-CH) /StructTreeRoot 224 0 R/MarkInfo<</Marked true>>>> |
endobj |
2 0 obj |
<</Type/Pages/Count 14/Kids[ 3 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 91 0 R 112 0 R 121 0 R 127 0 R 172 0 R 179 0 R 200 0 R 202 0 R] >> |
endobj |
3 0 obj |
<</Type/Page/Parent 2 0 R/Resources<</XObject<</Image5 5 0 R/Image36 36 0 R>>/Font<</F1 6 0 R/F2 8 0 R/F3 13 0 R/F4 15 0 R/F5 17 0 R/F6 22 0 R/F7 24 0 R/F8 34 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 26 0 R 32 0 R 33 0 R] /MediaBox[ 0 0 595.32 841.92] /Contents 4 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 0>> |
endobj |
4 0 obj |
<</Filter/FlateDecode/Length 11214>> |
stream |
-êýéÄMÚõÉ©ÜAOúäÔÀÒ#°j`Ka}Uߨ7ÇQÛiößkEßµóöÉ<ockü§Ð%æ(c '; |
-£3fªý hª3Õ´¶¢¯sEm9ºRA~|»ÃpS@éÁd9LPݱW¼þ=ºÞ~ÿ®(_ÿv¶¼*&íòô¿ÏNÃ̪ÕÊ»i:ïfÙÜ]·í&Ó,DWjåøª@y?(zöݽçrU leîÇ5ÞLU-ºÃDg"àuãc¾²ÐQüw÷(7Åæs1[bâ¢øÐâ »¹E´ëÙæÕÀº-ÎZ*pù«unX ß±dJÎ lq |
-Âgêèû·¹z^Oí°Þ"§sÜÚ⮧îî<÷]û |
-j¾[\¡-6 ´g]±ºÇØÜÞo°ã_0Ñ?Ø2ÀØs /ÖG¥ks@ÓÛÓfR,¢%Ñ®/Y:Ú£BÕÓf ñóNé0*îQQ¥)IÝ |
-ä&ŬÙfµcÏ~«ÈÚr`Ôå©lö² /êÑKK®ÛËæ'jÀ¹Ýû?³ón[ö¡£!Aº#õqƵlƬÍ!Îùi9ÊßãÓ¹Êâî44¿ÇÜ·Yø`LO]µ£ßä-nÀ×_d:|h êd+Eöjy©×xðQõ°ÍUÖ8ý¾iö½ã^Æ.=ÖºÍ GªzCã= |
-8Ú1nBæòúÄïÎdÈ»Òä|õ |
-*¾[ÿi|ÕduøFA=¬~"ôÝ´ëtÖMvÚû{ÉíýäUØ ìN>zr·¢0é'·Dôü¯ðGéÉiWLÿŬ f)q$ëÍF+9ûtªÊÕâ#Ã+°&Ø°Kúñ°SùG¾ü<Áº!ç9Éÿýu=(7¦Áoåüúç,+P+Èx%X7«¼1-Í°y{Gmh¢¤þbn',צ¾é×ÛlÑuï=Ì5[e? 5×íI} KÎ.Ô¦JIç_PªÏYH6+ôÄtßÀb(2Ĩ |
-~,7=ììv'§õä3¬'óÁ\tÍ7íd» f³Âµ¡å"Å¡0¢BE j5ùñ-ÞßÞÚºåö |
-r]ù¦Á`ÆÚj$ÒâÆ¿±_õmsá·ÀuZèVm/§Mlë¶ìÿ¦f²ÙºúÅÑî îøëÕýÅ=0ÐbÕº |
-üù]åÚ(@ÂÊYéNéi3,º_ fC»Û\ÂhôQ÷TÍø¤¤K5¥Û¾7Õ,ª®¦6¸Oè_\,p2Z¬09}¿¼\`XöÞ Ç2eH>κ{úXüLEv³M áÆýMÚ³´¾GYr¤.´ÈbÈÂX°Dêg]°ÎÀÚfkä¼(Al&yÂÔȬ&ïH ÞÓÝ5k&ÎjAHÍí-Ë-*§ïéGáG¡6· Ã)#Ö¼×2%åÀ¨ÆøQ´3I×Ì5¨*fçxõ§Ú++b |
-gna@ãd9 °ºA#IÉUªöÓ Ò«lY9(mMíqÏõ ìæNTs¸ìJ?¶4 6͸`äµCm0¨¸²Vh¦õ.&Wyªv{ßs¾"»Õª¬Â4¬ðÓ¤#ñ"f<Ëu©5Õóaµm6ü$N¶Ò`$ç:²lvjåEØlñM,e4i1Æée<4{õu´»t &DpõNYÔ3.Kc öÎ üÅ·×Ï7DŪ&%8ÌÛ¹øàö^¨Ð¸ãpÙÆÄ´>7Hÿ\uKýâvµÞä2¬øßÌÌÛû°Ðkªõ`LóLñ¨:õ/jR&j 62´åSë |
-Ò |
-wàÈ,iµ _D%£FÖ¤_(g`X¢lXãQY2:b,bËt(pÈ |
-I.mFjJtuiX44 |
-8£ã°$C` |
-GH}¢ |
-UM¤"Ôc |
-bù çUXû&ÖÅïx|&t?:ý.æÝ$Ú!T |
-%joå¥'Áã,u/ü¸eÐÎ _ìO}×Cq̸º$iãÀÅæÅ¿ú>Ù¤RBû<ÛddUa¼È.AMöH«ð%2,-tª¸£l?ñíÚâ{a9Ôn2díùÉÏB%xÿ$ |
-f`ps²R½û|]4^VíMB<¬O"]³cÅf0LÄ:¤;NÛ:d`ª¢K~k²BO jU¨¦CbÞ#IíغäHITO(H"`éÓ®Õj©Ö·DRÏYt¦å&ZÃ6Dmä;î+ |
-SÓ ¥CìpÂ.Á`oj¡/ò·¸0h)Ú$!ùj2àÀÈ90ã uä4¦|$'¦yE«½>h3RBV #ñJØ"ßSFâ4Û¸ MÊýPb8¼@ÿ§¨^xö -V¨+¨ØÏú)d-§º>jkúì`Åyã´' "Nôcë 0Âq;3Ø"Ê£g0´AAy6@¬ïmÐ,/ms ý |
-aOÄ{Öêôë b*E#Ö®Okdcù¬9cáTEÂWVLÚ"|¥"V!ÍÐt4omÓOBä6RN«àfõé¦'Wo+8¾ê´¢î¡Î#«k¦uÏzHõHXßTP )Üh°°}0khé¿G¦¼À[mªæÉ_åd'Ú}V£ÝMÉU°Ò¾²!£á 0¤C"HSvE¬¦¥Ð!°FE«ËL )IS2;RSqÍ´9Ì;0E:ÌZM×õßíÀÃzPQ¢´^Ò¯ñ;¤$\×ÿdZ%©ø=©C´ À@§ \÷8D®CJ(ò; IWÄ:ZêøãÐ(ßF+là7òµÜãa à74ÙÀxñ;ðÃâTEöÆYÌx^µNÂ#4-`)-3RÈRq N³;'Üxݧ"3:ιI20UògZõ)OIF]Ä6Ô$ÀaFÔ6`ÊÄò Aõ +7=¡¦ 5û6qáñÊs¢Å6B쪷pÛÅ<a´Ô |
-%\bÜÈê~3Ü@µg_Ï«C6·/â0¬caµ¦¢F¨Ýë¢Sv\§àÄI¼Éá<Æ{ û"pdÎ(éh¸¢¢ |
-Ô5U¤Á½ ¨»&Æ ìH:"Ã3TÈРƬûõ¯GgÆ£8áuQq;CÒÑØv%)¿HÃÙpO³9ZäPx˺áÍþ]ѸõXnÊvWl¿!ÎÉ>l["sDovÒبz§ýGþnÛÒ¾Áüi±¢qC¤ÄÀ¶!!6 F[Â×2XöP©hÙcíÒ´/"ÚCPB ñkZ/ÂìoKoÂñÞøßãáû÷nbÚÕ¡>m]¤R¾ |
-Ôr"¡¶ÿ:¨¡Î#£k¦}ÏxçùaáDÂøðµL+&méoK7Ø©*eÍ3ý÷áì3n¯dKL*ÔTÅwÔS¸RÔ¤zªÞÒ!ôâ,]¢§Dì*Ô]*Ï^Æ]³½¢Çõ&Uô!#л}JfÔ©f7¼sw7#êz^Ltý4>ô¯K_2yhËå5mÇkkP½xãafú¨rÜòæTõcÇÃÎpÃû[ÜÀþÛ]îIhñ¢Â*öi",ä#²öæp£Í³ØÝJEÅxÔ R6·Ø6{X½Ê!>£ÞYÄ >¿C>=ÊçGâô |
-Øh |
-Æãm©Étä÷0n²¯ôYrM¹vïÅ1 |
-HéÒ| *ð´ å©ÙmãÈ9W¿%äÚÒ6WIt[ÒÞâqJehÚPã« £9fA}¬R4av[8¹üÂ}¸¥%¼Ü!ic{3Ûÿ%:IÕÖáÄ2T Øm!Hü Æö^-ê,dDÃÈd |
-<Oåÿqb~ÆµØ ÍgÏaðÖçFÙèÅ7G÷pî<{+\ÕïzKßÐÍXº nô/Âm |
-¯ÃØq'OnÁE¡q:öxº%ÝaJpâÐ k0 áa°íºLp<s`gÂh5 UáJE<)[ñIø#5ùîä´nðêíºhÈ)·÷î*æD>¬ReÉ/é³ñ/B³¡Ó`Xþä·¡ Ñúß>ó~ìÈË$}æXÆò6'¶·s{ÚFàF¼av@k^ý´^¶ á°>%£¦ 5L&&ì64´Vö÷KÚâp ^ |
-ýMagS&d4:F]! ö¾p©èú4à0õ QϾ G4gÄûÄU!¯BF]Â/MïtÛyéø.j*$À#ÅÔ[è 9 ÔBj2\èqÓÿfX¾I¢+À`z |
-PµÏ5nX5ÏLÙ ¨ORÓDB¬§¸^ÒéC[²+®¹ìeh]ÿ=¹=¡±Lk¸jO¸¤Jøn0 °664á¨X*$yÏà>5Î@S~»þ§ìmã$íîu*©£ÂïyD6p⺩·±rM $]ë0M ýÌ:º¥ ÇR<㥠N¾¢$¥{Ûh»:É Ë®_¤$¾´?À·LûÙJxܳm ¤ |
-F5΢¸õdxÇ&î¿q6кðÑ$ÕLF|]¤ùo¥eq[mÀ?öÕÈ6Aeß&f ôýWf%çè 1¥iáÔ(CÓå`i<3§ç*òv]iäsëÁäÏ ª |
-½Ý£ÙÙËv÷è:ó³*¬G % cUÜK·ö¥[7°j¥æRUªY RwqgXHvÄñ'npÇßÎö¿ë0Öj*b |
- |
-yÖ92»P½ÖÕ{ |
-!fzßóëª\¤ßè5½ &0wwèÖÀHÆØ[;{ èØ£ ÜÕ¾©á<ëÉ/IKóIJgR#-Þ³¹Õ ¿u/Çþßmé°îså"Dûà\ |
-{¯ÛvÌÞ»$©ªÃcÅÙ¹Í3·=à®õ9"®U¸8RC4ÈÅx¨Ra°r£÷©$Ýõk±ÎE·íÂQ¦t1Ë%Å,Ëô`5<Õ¿·Þ#.r(yj5»79è^÷ìÈ/D-cþÎ÷÷7f[K|ð§K>^¼gø²ç¯y¼x/|²I%ÛÃË-KM¸4Ðà ¨ti üÇK㧾NBû<ÜÕEhC}¸«O¾táþ?O ûÿP`pÿ|úåo¹ûH+» ¦jö j©ËS:¢éT^/ÆD£½èo¹¦L8XÃû?8£ã5ª |
-rü¹núT6é÷Uk®*CÇ3xT± öpbB ÓP¯zá§8¥ s¼ÌùaÇÀhR´ÀXZçϧ"9Û¼°ÀĶçëwG@¿½°' |