]> pere.pagekite.me Git - homepage.git/blob - blog/tags/linuxcnc/index.html
22b2b9ab4f932e844c8e5c094a5177e8281e781a
[homepage.git] / blog / tags / linuxcnc / index.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
4 <head>
5 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
6 <title>Petter Reinholdtsen: Entries Tagged linuxcnc</title>
7 <link rel="stylesheet" type="text/css" media="screen" href="https://people.skolelinux.org/pere/blog/style.css" />
8 <link rel="stylesheet" type="text/css" media="screen" href="https://people.skolelinux.org/pere/blog/vim.css" />
9 <link rel="alternate" title="RSS Feed" href="linuxcnc.rss" type="application/rss+xml" />
10 </head>
11 <body>
12 <div class="title">
13 <h1>
14 <a href="https://people.skolelinux.org/pere/blog/">Petter Reinholdtsen</a>
15
16 </h1>
17
18 </div>
19
20
21 <h3>Entries tagged "linuxcnc".</h3>
22
23 <div class="entry">
24 <div class="title">
25 <a href="https://people.skolelinux.org/pere/blog/LinuxCNC_MQTT_publisher_component.html">LinuxCNC MQTT publisher component</a>
26 </div>
27 <div class="date">
28 8th January 2023
29 </div>
30 <div class="body">
31 <p>I watched <a href="https://yewtu.be/watch?v=jmKUV3aNLjk">a 2015
32 video from Andreas Schiffler</a> the other day, where he set up
33 <a href="https://linuxcnc.org/">LinuxCNC</a> to send status
34 information to the MQTT broker IBM Bluemix. As I also use MQTT for
35 graphing, it occured to me that a generic MQTT LinuxCNC component
36 would be useful and I set out to implement it. Today I got the first
37 draft limping along and submitted as
38 <a href="https://github.com/LinuxCNC/linuxcnc/pull/2253">a patch to the
39 LinuxCNC project</a>.</p>
40
41 <p>The simple part was setting up the MQTT publishing code in Python.
42 I already have set up other parts submitting data to my Mosquito MQTT
43 broker, so I could reuse that code. Writing a LinuxCNC component in
44 Python as new to me, but using existing examples in the code
45 repository and the extensive documentation, this was fairly straight
46 forward. The hardest part was creating a automated test for the
47 component to ensure it was working. Testing it in a simulated
48 LinuxCNC machine proved very useful, as I discovered features I needed
49 that I had not thought of yet, and adjusted the code quite a bit to
50 make it easier to test without a operational MQTT broker
51 available.</p>
52
53 <p>The draft is ready and working, but I am unsure which LinuxCNC HAL
54 pins I should collect and publish by default (in other words, the
55 default set of information pieces published), and how to get the
56 machine name from the LinuxCNC INI file. The latter is a minor
57 detail, but I expect it would be useful in a setup with several
58 machines available. I am hoping for feedback from the experienced
59 LinuxCNC developers and users, to make the component even better
60 before it can go into the mainland LinuxCNC code base.</p>
61
62 <p>Since I started on the MQTT component, I came across
63 <a href="https://yewtu.be/watch?v=Bqa2grG0XtA">another video from Kent
64 VanderVelden</a> where he combine LinuxCNC with a set of screen glasses
65 controlled by a Raspberry Pi, and it occured to me that it would
66 be useful for such use cases if LinuxCNC also provided a REST API for
67 querying its status. I hope to start on such component once the MQTT
68 component is working well.</p>
69
70 <p>As usual, if you use Bitcoin and want to show your support of my
71 activities, please send Bitcoin donations to my address
72 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
73
74 </div>
75 <div class="tags">
76
77
78 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc</a>, <a href="https://people.skolelinux.org/pere/blog/tags/robot">robot</a>.
79
80
81 </div>
82 </div>
83 <div class="padding"></div>
84
85 <div class="entry">
86 <div class="title">
87 <a href="https://people.skolelinux.org/pere/blog/Automatic_LinuxCNC_servo_PID_tuning_.html">Automatic LinuxCNC servo PID tuning?</a>
88 </div>
89 <div class="date">
90 16th July 2022
91 </div>
92 <div class="body">
93 <p>While working on a CNC with servo motors controlled by the
94 <a href="https://en.wikipedia.org/wiki/LinuxCNC">LinuxCNC</a>
95 <a href="https://en.wikipedia.org/wiki/PID_controller">PID
96 controller</a>, I recently had to learn how to tune the collection of values
97 that control such mathematical machinery that a PID controller is. It
98 proved to be a lot harder than I hoped, and I still have not succeeded
99 in getting the Z PID controller to successfully defy gravity, nor X
100 and Y to move accurately and reliably. But while climbing up this
101 rather steep learning curve, I discovered that some motor control
102 systems are able to tune their PID controllers. I got the impression
103 from the documentation that LinuxCNC were not. This proved to be not
104 true.</p>
105
106 <p>The LinuxCNC
107 <a href="http://linuxcnc.org/docs/html/man/man9/pid.9.html">pid
108 component</a> is the recommended PID controller to use. It uses eight
109 constants <tt>Pgain</tt>, <tt>Igain</tt>, <tt>Dgain</tt>,
110 <tt>bias</tt>, <tt>FF0</tt>, <tt>FF1</tt>, <tt>FF2</tt> and
111 <tt>FF3</tt> to calculate the output value based on current and wanted
112 state, and all of these need to have a sensible value for the
113 controller to behave properly. Note, there are even more values
114 involved, theser are just the most important ones. In my case I need
115 the X, Y and Z axes to follow the requested path with little error.
116 This has proved quite a challenge for someone who have never tuned a
117 PID controller before, but there is at least some help to be found.
118
119 <p>I discovered that included in LinuxCNC was this old PID component
120 at_pid claiming to have auto tuning capabilities. Sadly it had been
121 neglected since 2011, and could not be used as a plug in replacement
122 for the default pid component. One would have to rewriting the
123 LinuxCNC HAL setup to test at_pid. This was rather sad, when I wanted
124 to quickly test auto tuning to see if it did a better job than me at
125 figuring out good P, I and D values to use.</p>
126
127 <p>I decided to have a look if the situation could be improved. This
128 involved trying to understand the code and history of the pid and
129 at_pid components. Apparently they had a common ancestor, as code
130 structure, comments and variable names were quite close to each other.
131 Sadly this was not reflected in the git history, making it hard to
132 figure out what really happened. My guess is that the author of
133 <a href="https://github.com/LinuxCNC/linuxcnc/blob/master/src/hal/components/at_pid.c">at_pid.c</a>
134 took a version of
135 <a href="https://github.com/LinuxCNC/linuxcnc/blob/master/src/hal/components/pid.c">pid.c</a>,
136 rewrote it to follow the structure he wished pid.c to have, then added
137 support for auto tuning and finally got it included into the LinuxCNC
138 repository. The restructuring and lack of early history made it
139 harder to figure out which part of the code were relevant to the auto
140 tuning, and which part of the code needed to be updated to work the
141 same way as the current pid.c implementation. I started by trying to
142 isolate relevant changes in pid.c, and applying them to at_pid.c. My
143 aim was to make sure the at_pid component could replace the pid
144 component with a simple change in the HAL setup loadrt line, without
145 having to "rewire" the rest of the HAL configuration. After a few
146 hours following this approach, I had learned quite a lot about the
147 code structure of both components, while concluding I was heading down
148 the wrong rabbit hole, and should get back to the surface and find a
149 different path.</p>
150
151 <p>For the second attempt, I decided to throw away all the PID control
152 related part of the original at_pid.c, and instead isolate and lift
153 the auto tuning part of the code and inject it into a copy of pid.c.
154 This ensured compatibility with the current pid component, while
155 adding auto tuning as a run time option. To make it easier to identify
156 the relevant parts in the future, I wrapped all the auto tuning code
157 with '#ifdef AUTO_TUNER'. The end result behave just like the current
158 pid component by default, as that part of the code is identical. The
159 <a href="https://github.com/LinuxCNC/linuxcnc/pull/1820">end result
160 entered the LinuxCNC master branch</a> a few days ago.</p>
161
162 <p>To enable auto tuning, one need to set a few HAL pins in the PID
163 component. The most important ones are <tt>tune-effort</tt>,
164 <tt>tune-mode</tt> and <tt>tune-start</tt>. But lets take a step
165 back, and see what the auto tuning code will do. I do not know the
166 mathematical foundation of the at_pid algorithm, but from observation
167 I can tell that the algorithm will, when enabled, produce a square
168 wave pattern centered around the <tt>bias</tt> value on the output pin
169 of the PID controller. This can be seen using the HAL Scope provided
170 by LinuxCNC. In my case, this is translated into voltage (+-10V) sent
171 to the motor controller, which in turn is translated into motor speed.
172 So at_pid will ask the motor to move the axis back and forth. The
173 number of cycles in the pattern is controlled by the
174 <tt>tune-cycles</tt> pin, and the extremes of the wave pattern is
175 controlled by the <tt>tune-effort</tt> pin. Of course, trying to
176 change the direction of a physical object instantly (as in going
177 directly from a positive voltage to the equivalent negative voltage)
178 do not change velocity instantly, and it take some time for the object
179 to slow down and move in the opposite direction. This result in a
180 more smooth movement wave form, as the axis in question were vibrating
181 back and forth. When the axis reached the target speed in the
182 opposing direction, the auto tuner change direction again. After
183 several of these changes, the average time delay between the 'peaks'
184 and 'valleys' of this movement graph is then used to calculate
185 proposed values for Pgain, Igain and Dgain, and insert them into the
186 HAL model to use by the pid controller. The auto tuned settings are
187 not great, but htye work a lot better than the values I had been able
188 to cook up on my own, at least for the horizontal X and Y axis. But I
189 had to use very small <tt>tune-effort<tt> values, as my motor
190 controllers error out if the voltage change too quickly. I've been
191 less lucky with the Z axis, which is moving a heavy object up and
192 down, and seem to confuse the algorithm. The Z axis movement became a
193 lot better when I introduced a <tt>bias</tt> value to counter the
194 gravitational drag, but I will have to work a lot more on the Z axis
195 PID values.</p>
196
197 <p>Armed with this knowledge, it is time to look at how to do the
198 tuning. Lets say the HAL configuration in question load the PID
199 component for X, Y and Z like this:</p>
200
201 <blockquote><pre>
202 loadrt pid names=pid.x,pid.y,pid.z
203 </pre></blockquote>
204
205 <p>Armed with the new and improved at_pid component, the new line will
206 look like this:</p>
207
208 <blockquote><pre>
209 loadrt at_pid names=pid.x,pid.y,pid.z
210 </pre></blockquote>
211
212 <p>The rest of the HAL setup can stay the same. This work because the
213 components are referenced by name. If the component had used count=3
214 instead, all use of pid.# had to be changed to at_pid.#.</p>
215
216 <p>To start tuning the X axis, move the axis to the middle of its
217 range, to make sure it do not hit anything when it start moving back
218 and forth. Next, set the <tt>tune-effort</tt> to a low number in the
219 output range. I used 0.1 as my initial value. Next, assign 1 to the
220 <tt>tune-mode</tt> value. Note, this will disable the pid controlling
221 part and feed 0 to the output pin, which in my case initially caused a
222 lot of drift. In my case it proved to be a good idea with X and Y to
223 tune the motor driver to make sure 0 voltage stopped the motor
224 rotation. On the other hand, for the Z axis this proved to be a bad
225 idea, so it will depend on your setup. It might help to set the
226 <tt>bias</tt> value to a output value that reduce or eliminate the
227 axis drift. Finally, after setting <tt>tune-mode</tt>, set
228 <tt>tune-start</tt> to 1 to activate the auto tuning. If all go well,
229 your axis will vibrate for a few seconds and when it is done, new
230 values for Pgain, Igain and Dgain will be active. To test them,
231 change <tt>tune-mode</tt> back to 0. Note that this might cause the
232 machine to suddenly jerk as it bring the axis back to its commanded
233 position, which it might have drifted away from during tuning. To
234 summarize with some halcmd lines:</p>
235
236 <blockquote><pre>
237 setp pid.x.tune-effort 0.1
238 setp pid.x.tune-mode 1
239 setp pid.x.tune-start 1
240 # wait for the tuning to complete
241 setp pid.x.tune-mode 0
242 </pre></blockquote>
243
244 <p>After doing this task quite a few times while trying to figure out
245 how to properly tune the PID controllers on the machine in, I decided
246 to figure out if this process could be automated, and wrote a script
247 to do the entire tuning process from power on. The end result will
248 ensure the machine is powered on and ready to run, home all axis if it
249 is not already done, check that the extra tuning pins are available,
250 move the axis to its mid point, run the auto tuning and re-enable the
251 pid controller when it is done. It can be run several times. Check
252 out the
253 <a href="https://github.com/SebKuzminsky/MazakVQC1540/blob/bon-dev/scripts/run-auto-pid-tuner">run-auto-pid-tuner</a>
254 script on github if you want to learn how it is done.</p>
255
256 <p>My hope is that this little adventure can inspire someone who know
257 more about motor PID controller tuning can implement even better
258 algorithms for automatic PID tuning in LinuxCNC, making life easier
259 for both me and all the others that want to use LinuxCNC but lack the
260 in depth knowledge needed to tune PID controllers well.</p>
261
262 <p>As usual, if you use Bitcoin and want to show your support of my
263 activities, please send Bitcoin donations to my address
264 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
265
266 </div>
267 <div class="tags">
268
269
270 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer</a>, <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc</a>, <a href="https://people.skolelinux.org/pere/blog/tags/robot">robot</a>.
271
272
273 </div>
274 </div>
275 <div class="padding"></div>
276
277 <div class="entry">
278 <div class="title">
279 <a href="https://people.skolelinux.org/pere/blog/LinuxCNC_translators_life_just_got_a_bit_easier.html">LinuxCNC translators life just got a bit easier</a>
280 </div>
281 <div class="date">
282 3rd June 2022
283 </div>
284 <div class="body">
285 <p>Back in oktober last year, when I started looking at the
286 <a href="https://en.wikipedia.org/wiki/LinuxCNC">LinuxCNC</a> system, I
287 proposed to change the documentation build system make life easier for
288 translators. The original system consisted of independently written
289 documentation files for each language, with no automated way to track
290 changes done in other translations and no help for the translators to
291 know how much was left to translated. By using
292 <a href="https://po4a.org/">the po4a system</a> to generate POT and PO
293 files from the English documentation, this can be improved. A small
294 team of LinuxCNC contributors got together and today our labour
295 finally payed off. Since a few hours ago, it is now possible to
296 translate <a href="https://hosted.weblate.org/projects/linuxcnc/">the
297 LinuxCNC documentation on Weblate</a>, alongside the program itself.</p>
298
299 <p>The effort to migrate the documentation to use po4a has been both
300 slow and frustrating. I am very happy we finally made it.</p>
301
302 <p>As usual, if you use Bitcoin and want to show your support of my
303 activities, please send Bitcoin donations to my address
304 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
305
306 </div>
307 <div class="tags">
308
309
310 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer</a>, <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc</a>, <a href="https://people.skolelinux.org/pere/blog/tags/robot">robot</a>.
311
312
313 </div>
314 </div>
315 <div class="padding"></div>
316
317 <div class="entry">
318 <div class="title">
319 <a href="https://people.skolelinux.org/pere/blog/Run_your_industrial_metal_working_machine_using_Debian_.html">Run your industrial metal working machine using Debian?</a>
320 </div>
321 <div class="date">
322 2nd March 2022
323 </div>
324 <div class="body">
325 <p>After many months of hard work by the good people involved in
326 <a href="https://en.wikipedia.org/wiki/LinuxCNC">LinuxCNC</a>, the
327 system was accepted Sunday
328 <a href="https://tracker.debian.org/pkg/linuxcnc">into Debian</a>.
329 Once it was available from Debian, I was surprised to discover from
330 <a href="https://qa.debian.org/popcon.php?package=linuxcnc">its
331 popularity-contest numbers</a> that people have been reporting its use
332 since 2012. <a href="http://linuxcnc.org/">Its project site</a> might
333 be a good place to check out, but sadly is not working when visiting
334 via Tor.</p>
335
336 <p>But what is LinuxCNC, you are probably wondering? Perhaps a
337 Wikipedia quote is in place?</p>
338
339 <blockquote>
340 "LinuxCNC is a software system for numerical control of
341 machines such as milling machines, lathes, plasma cutters, routers,
342 cutting machines, robots and hexapods. It can control up to 9 axes or
343 joints of a CNC machine using G-code (RS-274NGC) as input. It has
344 several GUIs suited to specific kinds of usage (touch screen,
345 interactive development)."
346 </blockquote>
347
348 <p>It can even control 3D printers. And even though the Wikipedia
349 page indicate that it can only work with hard real time kernel
350 features, it can also work with the user space soft real time features
351 provided by the Debian kernel.
352 <a href="https://github.com/linuxcnc/linuxcnc">The source code</a> is
353 available from Github. The last few months I've been involved in the
354 translation setup for the program and documentation. Translators are
355 most welcome to
356 <a href="https://hosted.weblate.org/engage/linuxcnc/">join the
357 effort</a> using Weblate.</p>
358
359 <p>As usual, if you use Bitcoin and want to show your support of my
360 activities, please send Bitcoin donations to my address
361 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
362
363 </div>
364 <div class="tags">
365
366
367 Tags: <a href="https://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer</a>, <a href="https://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="https://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc</a>, <a href="https://people.skolelinux.org/pere/blog/tags/robot">robot</a>.
368
369
370 </div>
371 </div>
372 <div class="padding"></div>
373
374 <p style="text-align: right;"><a href="linuxcnc.rss"><img src="https://people.skolelinux.org/pere/blog/xml.gif" alt="RSS Feed" width="36" height="14" /></a></p>
375 <div id="sidebar">
376
377
378
379 <h2>Archive</h2>
380 <ul>
381
382 <li>2023
383 <ul>
384
385 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/01/">January (3)</a></li>
386
387 <li><a href="https://people.skolelinux.org/pere/blog/archive/2023/02/">February (1)</a></li>
388
389 </ul></li>
390
391 <li>2022
392 <ul>
393
394 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/02/">February (1)</a></li>
395
396 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/03/">March (3)</a></li>
397
398 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/04/">April (2)</a></li>
399
400 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/06/">June (2)</a></li>
401
402 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/07/">July (1)</a></li>
403
404 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/09/">September (1)</a></li>
405
406 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/10/">October (1)</a></li>
407
408 <li><a href="https://people.skolelinux.org/pere/blog/archive/2022/12/">December (1)</a></li>
409
410 </ul></li>
411
412 <li>2021
413 <ul>
414
415 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/01/">January (2)</a></li>
416
417 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/02/">February (1)</a></li>
418
419 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/05/">May (1)</a></li>
420
421 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/06/">June (1)</a></li>
422
423 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/07/">July (3)</a></li>
424
425 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/08/">August (1)</a></li>
426
427 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/09/">September (1)</a></li>
428
429 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/10/">October (1)</a></li>
430
431 <li><a href="https://people.skolelinux.org/pere/blog/archive/2021/12/">December (1)</a></li>
432
433 </ul></li>
434
435 <li>2020
436 <ul>
437
438 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/02/">February (2)</a></li>
439
440 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/03/">March (2)</a></li>
441
442 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/04/">April (2)</a></li>
443
444 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/05/">May (3)</a></li>
445
446 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/06/">June (2)</a></li>
447
448 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/07/">July (1)</a></li>
449
450 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/09/">September (1)</a></li>
451
452 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/10/">October (1)</a></li>
453
454 <li><a href="https://people.skolelinux.org/pere/blog/archive/2020/11/">November (1)</a></li>
455
456 </ul></li>
457
458 <li>2019
459 <ul>
460
461 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/01/">January (4)</a></li>
462
463 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/02/">February (3)</a></li>
464
465 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/03/">March (3)</a></li>
466
467 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/05/">May (2)</a></li>
468
469 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/06/">June (5)</a></li>
470
471 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/07/">July (2)</a></li>
472
473 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/08/">August (1)</a></li>
474
475 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/09/">September (1)</a></li>
476
477 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/11/">November (1)</a></li>
478
479 <li><a href="https://people.skolelinux.org/pere/blog/archive/2019/12/">December (4)</a></li>
480
481 </ul></li>
482
483 <li>2018
484 <ul>
485
486 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/01/">January (1)</a></li>
487
488 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/02/">February (5)</a></li>
489
490 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/03/">March (5)</a></li>
491
492 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/04/">April (3)</a></li>
493
494 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/06/">June (2)</a></li>
495
496 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/07/">July (5)</a></li>
497
498 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/08/">August (3)</a></li>
499
500 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/09/">September (3)</a></li>
501
502 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/10/">October (5)</a></li>
503
504 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/11/">November (2)</a></li>
505
506 <li><a href="https://people.skolelinux.org/pere/blog/archive/2018/12/">December (4)</a></li>
507
508 </ul></li>
509
510 <li>2017
511 <ul>
512
513 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/01/">January (4)</a></li>
514
515 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/02/">February (3)</a></li>
516
517 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/03/">March (5)</a></li>
518
519 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/04/">April (2)</a></li>
520
521 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/06/">June (5)</a></li>
522
523 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/07/">July (1)</a></li>
524
525 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/08/">August (1)</a></li>
526
527 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/09/">September (3)</a></li>
528
529 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/10/">October (5)</a></li>
530
531 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/11/">November (3)</a></li>
532
533 <li><a href="https://people.skolelinux.org/pere/blog/archive/2017/12/">December (4)</a></li>
534
535 </ul></li>
536
537 <li>2016
538 <ul>
539
540 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/01/">January (3)</a></li>
541
542 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/02/">February (2)</a></li>
543
544 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/03/">March (3)</a></li>
545
546 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/04/">April (8)</a></li>
547
548 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/05/">May (8)</a></li>
549
550 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/06/">June (2)</a></li>
551
552 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/07/">July (2)</a></li>
553
554 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/08/">August (5)</a></li>
555
556 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/09/">September (2)</a></li>
557
558 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/10/">October (3)</a></li>
559
560 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/11/">November (8)</a></li>
561
562 <li><a href="https://people.skolelinux.org/pere/blog/archive/2016/12/">December (5)</a></li>
563
564 </ul></li>
565
566 <li>2015
567 <ul>
568
569 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/01/">January (7)</a></li>
570
571 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/02/">February (6)</a></li>
572
573 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/03/">March (1)</a></li>
574
575 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/04/">April (4)</a></li>
576
577 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/05/">May (3)</a></li>
578
579 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/06/">June (4)</a></li>
580
581 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/07/">July (6)</a></li>
582
583 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/08/">August (2)</a></li>
584
585 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/09/">September (2)</a></li>
586
587 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/10/">October (9)</a></li>
588
589 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/11/">November (6)</a></li>
590
591 <li><a href="https://people.skolelinux.org/pere/blog/archive/2015/12/">December (3)</a></li>
592
593 </ul></li>
594
595 <li>2014
596 <ul>
597
598 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/01/">January (2)</a></li>
599
600 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/02/">February (3)</a></li>
601
602 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/03/">March (8)</a></li>
603
604 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/04/">April (7)</a></li>
605
606 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/05/">May (1)</a></li>
607
608 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/06/">June (2)</a></li>
609
610 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/07/">July (2)</a></li>
611
612 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/08/">August (2)</a></li>
613
614 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/09/">September (5)</a></li>
615
616 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/10/">October (6)</a></li>
617
618 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/11/">November (3)</a></li>
619
620 <li><a href="https://people.skolelinux.org/pere/blog/archive/2014/12/">December (5)</a></li>
621
622 </ul></li>
623
624 <li>2013
625 <ul>
626
627 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/01/">January (11)</a></li>
628
629 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/02/">February (9)</a></li>
630
631 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/03/">March (9)</a></li>
632
633 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/04/">April (6)</a></li>
634
635 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/05/">May (9)</a></li>
636
637 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/06/">June (10)</a></li>
638
639 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/07/">July (7)</a></li>
640
641 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/08/">August (3)</a></li>
642
643 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/09/">September (5)</a></li>
644
645 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/10/">October (7)</a></li>
646
647 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/11/">November (9)</a></li>
648
649 <li><a href="https://people.skolelinux.org/pere/blog/archive/2013/12/">December (3)</a></li>
650
651 </ul></li>
652
653 <li>2012
654 <ul>
655
656 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/01/">January (7)</a></li>
657
658 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/02/">February (10)</a></li>
659
660 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/03/">March (17)</a></li>
661
662 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/04/">April (12)</a></li>
663
664 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/05/">May (12)</a></li>
665
666 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/06/">June (20)</a></li>
667
668 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/07/">July (17)</a></li>
669
670 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/08/">August (6)</a></li>
671
672 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/09/">September (9)</a></li>
673
674 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/10/">October (17)</a></li>
675
676 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/11/">November (10)</a></li>
677
678 <li><a href="https://people.skolelinux.org/pere/blog/archive/2012/12/">December (7)</a></li>
679
680 </ul></li>
681
682 <li>2011
683 <ul>
684
685 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/01/">January (16)</a></li>
686
687 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/02/">February (6)</a></li>
688
689 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/03/">March (6)</a></li>
690
691 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/04/">April (7)</a></li>
692
693 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/05/">May (3)</a></li>
694
695 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/06/">June (2)</a></li>
696
697 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/07/">July (7)</a></li>
698
699 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/08/">August (6)</a></li>
700
701 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/09/">September (4)</a></li>
702
703 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/10/">October (2)</a></li>
704
705 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/11/">November (3)</a></li>
706
707 <li><a href="https://people.skolelinux.org/pere/blog/archive/2011/12/">December (1)</a></li>
708
709 </ul></li>
710
711 <li>2010
712 <ul>
713
714 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/01/">January (2)</a></li>
715
716 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/02/">February (1)</a></li>
717
718 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/03/">March (3)</a></li>
719
720 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/04/">April (3)</a></li>
721
722 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/05/">May (9)</a></li>
723
724 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/06/">June (14)</a></li>
725
726 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/07/">July (12)</a></li>
727
728 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/08/">August (13)</a></li>
729
730 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/09/">September (7)</a></li>
731
732 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/10/">October (9)</a></li>
733
734 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/11/">November (13)</a></li>
735
736 <li><a href="https://people.skolelinux.org/pere/blog/archive/2010/12/">December (12)</a></li>
737
738 </ul></li>
739
740 <li>2009
741 <ul>
742
743 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/01/">January (8)</a></li>
744
745 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/02/">February (8)</a></li>
746
747 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/03/">March (12)</a></li>
748
749 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/04/">April (10)</a></li>
750
751 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/05/">May (9)</a></li>
752
753 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/06/">June (3)</a></li>
754
755 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/07/">July (4)</a></li>
756
757 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/08/">August (3)</a></li>
758
759 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/09/">September (1)</a></li>
760
761 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/10/">October (2)</a></li>
762
763 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/11/">November (3)</a></li>
764
765 <li><a href="https://people.skolelinux.org/pere/blog/archive/2009/12/">December (3)</a></li>
766
767 </ul></li>
768
769 <li>2008
770 <ul>
771
772 <li><a href="https://people.skolelinux.org/pere/blog/archive/2008/11/">November (5)</a></li>
773
774 <li><a href="https://people.skolelinux.org/pere/blog/archive/2008/12/">December (7)</a></li>
775
776 </ul></li>
777
778 </ul>
779
780
781
782 <h2>Tags</h2>
783 <ul>
784
785 <li><a href="https://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer (19)</a></li>
786
787 <li><a href="https://people.skolelinux.org/pere/blog/tags/amiga">amiga (1)</a></li>
788
789 <li><a href="https://people.skolelinux.org/pere/blog/tags/aros">aros (1)</a></li>
790
791 <li><a href="https://people.skolelinux.org/pere/blog/tags/bankid">bankid (4)</a></li>
792
793 <li><a href="https://people.skolelinux.org/pere/blog/tags/betalkontant">betalkontant (9)</a></li>
794
795 <li><a href="https://people.skolelinux.org/pere/blog/tags/bitcoin">bitcoin (12)</a></li>
796
797 <li><a href="https://people.skolelinux.org/pere/blog/tags/bootsystem">bootsystem (17)</a></li>
798
799 <li><a href="https://people.skolelinux.org/pere/blog/tags/bsa">bsa (2)</a></li>
800
801 <li><a href="https://people.skolelinux.org/pere/blog/tags/chrpath">chrpath (2)</a></li>
802
803 <li><a href="https://people.skolelinux.org/pere/blog/tags/debian">debian (188)</a></li>
804
805 <li><a href="https://people.skolelinux.org/pere/blog/tags/debian edu">debian edu (159)</a></li>
806
807 <li><a href="https://people.skolelinux.org/pere/blog/tags/debian-handbook">debian-handbook (9)</a></li>
808
809 <li><a href="https://people.skolelinux.org/pere/blog/tags/digistan">digistan (11)</a></li>
810
811 <li><a href="https://people.skolelinux.org/pere/blog/tags/dld">dld (18)</a></li>
812
813 <li><a href="https://people.skolelinux.org/pere/blog/tags/docbook">docbook (30)</a></li>
814
815 <li><a href="https://people.skolelinux.org/pere/blog/tags/drivstoffpriser">drivstoffpriser (4)</a></li>
816
817 <li><a href="https://people.skolelinux.org/pere/blog/tags/english">english (444)</a></li>
818
819 <li><a href="https://people.skolelinux.org/pere/blog/tags/fiksgatami">fiksgatami (23)</a></li>
820
821 <li><a href="https://people.skolelinux.org/pere/blog/tags/fildeling">fildeling (14)</a></li>
822
823 <li><a href="https://people.skolelinux.org/pere/blog/tags/freeculture">freeculture (34)</a></li>
824
825 <li><a href="https://people.skolelinux.org/pere/blog/tags/freedombox">freedombox (9)</a></li>
826
827 <li><a href="https://people.skolelinux.org/pere/blog/tags/frikanalen">frikanalen (20)</a></li>
828
829 <li><a href="https://people.skolelinux.org/pere/blog/tags/h264">h264 (20)</a></li>
830
831 <li><a href="https://people.skolelinux.org/pere/blog/tags/intervju">intervju (43)</a></li>
832
833 <li><a href="https://people.skolelinux.org/pere/blog/tags/isenkram">isenkram (16)</a></li>
834
835 <li><a href="https://people.skolelinux.org/pere/blog/tags/kart">kart (23)</a></li>
836
837 <li><a href="https://people.skolelinux.org/pere/blog/tags/kodi">kodi (4)</a></li>
838
839 <li><a href="https://people.skolelinux.org/pere/blog/tags/ldap">ldap (9)</a></li>
840
841 <li><a href="https://people.skolelinux.org/pere/blog/tags/lego">lego (5)</a></li>
842
843 <li><a href="https://people.skolelinux.org/pere/blog/tags/lenker">lenker (8)</a></li>
844
845 <li><a href="https://people.skolelinux.org/pere/blog/tags/linuxcnc">linuxcnc (4)</a></li>
846
847 <li><a href="https://people.skolelinux.org/pere/blog/tags/lsdvd">lsdvd (2)</a></li>
848
849 <li><a href="https://people.skolelinux.org/pere/blog/tags/ltsp">ltsp (1)</a></li>
850
851 <li><a href="https://people.skolelinux.org/pere/blog/tags/madewithcc">madewithcc (3)</a></li>
852
853 <li><a href="https://people.skolelinux.org/pere/blog/tags/mesh network">mesh network (8)</a></li>
854
855 <li><a href="https://people.skolelinux.org/pere/blog/tags/multimedia">multimedia (44)</a></li>
856
857 <li><a href="https://people.skolelinux.org/pere/blog/tags/nice free software">nice free software (13)</a></li>
858
859 <li><a href="https://people.skolelinux.org/pere/blog/tags/noark5">noark5 (23)</a></li>
860
861 <li><a href="https://people.skolelinux.org/pere/blog/tags/norsk">norsk (320)</a></li>
862
863 <li><a href="https://people.skolelinux.org/pere/blog/tags/nuug">nuug (198)</a></li>
864
865 <li><a href="https://people.skolelinux.org/pere/blog/tags/offentlig innsyn">offentlig innsyn (40)</a></li>
866
867 <li><a href="https://people.skolelinux.org/pere/blog/tags/open311">open311 (2)</a></li>
868
869 <li><a href="https://people.skolelinux.org/pere/blog/tags/opphavsrett">opphavsrett (75)</a></li>
870
871 <li><a href="https://people.skolelinux.org/pere/blog/tags/personvern">personvern (114)</a></li>
872
873 <li><a href="https://people.skolelinux.org/pere/blog/tags/raid">raid (2)</a></li>
874
875 <li><a href="https://people.skolelinux.org/pere/blog/tags/reactos">reactos (1)</a></li>
876
877 <li><a href="https://people.skolelinux.org/pere/blog/tags/reprap">reprap (11)</a></li>
878
879 <li><a href="https://people.skolelinux.org/pere/blog/tags/rfid">rfid (3)</a></li>
880
881 <li><a href="https://people.skolelinux.org/pere/blog/tags/robot">robot (17)</a></li>
882
883 <li><a href="https://people.skolelinux.org/pere/blog/tags/rss">rss (1)</a></li>
884
885 <li><a href="https://people.skolelinux.org/pere/blog/tags/ruter">ruter (7)</a></li>
886
887 <li><a href="https://people.skolelinux.org/pere/blog/tags/scraperwiki">scraperwiki (2)</a></li>
888
889 <li><a href="https://people.skolelinux.org/pere/blog/tags/sikkerhet">sikkerhet (59)</a></li>
890
891 <li><a href="https://people.skolelinux.org/pere/blog/tags/sitesummary">sitesummary (4)</a></li>
892
893 <li><a href="https://people.skolelinux.org/pere/blog/tags/skepsis">skepsis (5)</a></li>
894
895 <li><a href="https://people.skolelinux.org/pere/blog/tags/standard">standard (74)</a></li>
896
897 <li><a href="https://people.skolelinux.org/pere/blog/tags/stavekontroll">stavekontroll (7)</a></li>
898
899 <li><a href="https://people.skolelinux.org/pere/blog/tags/stortinget">stortinget (14)</a></li>
900
901 <li><a href="https://people.skolelinux.org/pere/blog/tags/surveillance">surveillance (64)</a></li>
902
903 <li><a href="https://people.skolelinux.org/pere/blog/tags/sysadmin">sysadmin (5)</a></li>
904
905 <li><a href="https://people.skolelinux.org/pere/blog/tags/usenix">usenix (2)</a></li>
906
907 <li><a href="https://people.skolelinux.org/pere/blog/tags/valg">valg (9)</a></li>
908
909 <li><a href="https://people.skolelinux.org/pere/blog/tags/verkidetfri">verkidetfri (20)</a></li>
910
911 <li><a href="https://people.skolelinux.org/pere/blog/tags/video">video (77)</a></li>
912
913 <li><a href="https://people.skolelinux.org/pere/blog/tags/vitenskap">vitenskap (4)</a></li>
914
915 <li><a href="https://people.skolelinux.org/pere/blog/tags/web">web (42)</a></li>
916
917 </ul>
918
919
920 </div>
921 <p style="text-align: right">
922 Created by <a href="http://steve.org.uk/Software/chronicle">Chronicle v4.6</a>
923 </p>
924
925 </body>
926 </html>